【项目】论坛系统项目自动化测试

论坛系统项目自动化测试

  • 前述
  • 一、脑图
  • 二、代码编写
    • 1.公共类InitAndEnd
    • 1.登录页面测试ForumLoginTest
      • 正常登录:
      • 异常登录:
    • 3.注册页面测试ForumRegisterTest
      • 注册成功:
      • 注册失败:
    • 4论坛列表页面测试ForumListTest
      • 登录状态下:
      • 未登录状态下:
    • 5.论坛帖子编辑测试ForumEditTest
      • 登录状态下
      • 未登录状态下:
    • 6.个人中心显示测试ForumPerson
      • 登录状态下:
      • 异常登录状态下:
    • 7.退出操作测试ForumOut
      • 8.驱动释放DriverQuiteTest
  • 3.代码测试:
  • 5.小结:
  • 6. 难点以及亮点
    • 一、难点
    • 二、亮点

前述

基于前后端分离的论坛系统,进行自动化测试。个人博客主要有五个页面构成:登录页、注册页、论坛列表展示页,帖子发布和个人中心页面。测试登录页面,注册页面,论坛列表页展示页面以及论坛帖子发布页面,个人信息展示,退出操作功能。
个人博客地址:https://gitee.com/arlene-c/auto_test_forum.git
自动化测试一般步骤:
1)使用脑图编写web自动化测试用例
2)创建自动化项目,根据用例来实现脚本

一、脑图

在这里插入图片描述

二、代码编写

  1. 添加相关依赖pom.xml
<dependencies><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency><!--        添加junit5依赖--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency></dependencies>
  1. 新建包并在包下创建测试类以及公共类
    以下是所建立的是common公共包和Tests测试包:
    在这里插入图片描述

  2. 新建包并在包下创建测试类以及公共类
    1)公共类InitAndEnd
    2)登录页面测试ForumLogin
    3)列表页测试 ForumList
    4)编辑页测试 ForumEdit
    5)详情页测试ForumDetail
    6)个人中心测试ForumPerson
    7)退出操作测试ForumOut
    8)驱动释放DriverQuite
    9)测试套件runSuite

  3. 代码参考
    三、代码测试
    https://gitee.com/arlene-c/auto_test_forum.git

1.公共类InitAndEnd

创建公共的驱动对象,方便代码复用。减少内存消耗;
在保存现场截图,然后图片的名称要体现出测试类的类名,方便进行问题的追溯。

public class InitAndEnd {static  WebDriver webDriver;@BeforeAllstatic void SetUp(){webDriver=new ChromeDriver();}@AfterAllstatic void TearDown(){webDriver.quit();}public List<String> getTime(){//文件按照天的维度按文件夹进行保存//文件格式 20230212-123030毫秒SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sim2=new SimpleDateFormat("yyyyMMdd");String filename = sim1.format(System.currentTimeMillis());String dirname = sim2.format(System.currentTimeMillis());List<String> list =new ArrayList<>();list.add(dirname);list.add(filename);return  list;}

1.登录页面测试ForumLoginTest

正常登录:

@ParameterizedTest@CsvSource(value = "linlin, 111111")void Login1(String username, String password) throws InterruptedException, IOException {// 打开登录页面webDriver.get("http://127.0.0.1:58080/sign-in.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);Thread.sleep(1000); // 显示等待,等待弹窗出现// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到博客列表页String expect = "http://127.0.0.1:58080/index.html";String actual = webDriver.getCurrentUrl();//
//        // 进行截图,看当前是否跳转到了登录界面webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertEquals(expect, actual); // 查看当前的url是否在博客详情页面// 进行截图,看当前是否跳转到了登录界面// 程序执行的速度和页面渲染的速度File srcFile = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);String fileName = "loginTest.png";FileUtils.copyFile(srcFile, new File(fileName));Thread.sleep(1000); // 显示等待,等待弹窗出现

异常登录:

 /*** 场景2:用户名正常,密码错误*/@Order(2)@ParameterizedTest@CsvSource(value = "linlin, 123")void Login2(String username, String password) throws InterruptedException, IOException {// 打开登录页面webDriver.get("http://127.0.0.1:58080/sign-in.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);Thread.sleep(1000);String msg = webDriver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div")).getText();System.out.println(msg);}

3.注册页面测试ForumRegisterTest

论坛注册页面是否可以正常显示;
测试注册功能正常情况,注册成功会返回登录页面;
测试注册功能异常情况,用户名重复和两次密码不一致,报出警告,停留在注册页面;

注册成功:

public class ForumRegister extends InitAndEnd{/*** 场景1:不存在的用户名,昵称,两次密码一致*/@Order(1)@ParameterizedTest@CsvSource(value = "best,best,123,123")void Register(String username, String nickname,String password1,String password2) throws InterruptedException, IOException {// 打开注册页面webDriver.get("http://127.0.0.1:58080/sign-in.html");//点击注册按钮body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > awebDriver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入昵称webDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password1);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 确认密码webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(password2);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//点击复选框webDriver.findElement(By.cssSelector("#policy")).click();// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000); // 显示等待// 注册成功之后,判断是否会跳转回登录界面String expect = "http://127.0.0.1:58080/sign-in.html";String actual = webDriver.getCurrentUrl();// 进行截图,看当前是否跳转到了登录界面webDriver.manage().timeouts().implicitlyWait(300, TimeUnit.MINUTES);Assertions.assertEquals(expect, actual);System.out.println("注册成功");// 进行截图,看当前是否跳转到了登录界面

注册失败:

/*** 场景2:已存在的用户名,昵称*/@Order(2)@ParameterizedTest@CsvSource(value = "linlin,linlin,111111,11111")void RegisterFail(String username, String nickname,String password1,String password2) throws InterruptedException, IOException {// 打开注册页面webDriver.get("http://127.0.0.1:58080/sign-in.html");//点击注册按钮body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > awebDriver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入昵称webDriver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password1);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 确认密码webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(password2);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//点击复选框webDriver.findElement(By.cssSelector("#policy")).click();// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000); // 显示等待// 注册成功之后,判断是否会跳转回登录界面String expect = "http://127.0.0.1:58080/sign-in.html";String actual = webDriver.getCurrentUrl();// 进行截图,看当前是否跳转到了登录界面webDriver.manage().timeouts().implicitlyWait(300, TimeUnit.MINUTES);Assertions.assertEquals(expect, actual);System.out.println("注册成功");

4论坛列表页面测试ForumListTest

登录状态下,列表页面是否可以正常显示;
未登录状态,列表页面是否可以正常显示;
在单独进行该案例测试的时候,可以检测是否弹出了警告或者回到了登陆页面,用来判断未登录状态下的,列表页面功能是否正常

登录状态下:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class FormList extends InitAndEnd {/*** 论坛列表页帖子数量不为0*/@Testvoid ListSuc() throws IOException {webDriver.get("http://127.0.0.1:58080/sign-in.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);int title_num = webDriver.findElements(By.cssSelector(".title")).size();Assertions.assertEquals(0, title_num);}@ParameterizedTest@CsvSource(value = "linlin, 111111")void ListDetail(String username, String password) throws InterruptedException, IOException {//1-登录// 打开登录页面webDriver.get("http://127.0.0.1:58080/sign-in.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);//2-查看页面的文本内容显示是否正确String expect1 = "首页";System.out.println();//#article_list_board_title #article_list_board_title #bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > divString actual1 = webDriver.findElement(By.cssSelector("#article_list_board_title")).getText();Assertions.assertEquals(expect1, actual1); // 断言//截图File srcFile =  ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);String fileName = "BlogListSuccess.png";FileUtils.copyFile(srcFile, new File(fileName));//3-查看是否有发布帖子按钮,并点击webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();Thread.sleep(1000);//查看是否跳转到博客编辑页面String expectUrl = "http://127.0.0.1:58080/index.html";String actualUrl = webDriver.getCurrentUrl();Assertions.assertEquals(expectUrl, actualUrl); // 断言System.out.println("跳转到边界帖子页面");

未登录状态下:

 /*** 未登录状态下,进入博客列表页,是否跳转回登录页面*/@Testvoid ForumList1() throws InterruptedException, IOException {//1-不登录,直接打开博客显示列表页webDriver.get("http://127.0.0.1:58080/index.html");//获取当前的url地址String expect = "http://127.0.0.1:58080/sign-in.html";String actual = webDriver.getCurrentUrl();//判断是否跳转到登录界面webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertEquals(expect, actual);//截图File srcFile =  ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);String fileName = "ForumListFailed.png";FileUtils.copyFile(srcFile, new File(fileName));}
}

5.论坛帖子编辑测试ForumEditTest

未登录状态,编辑页面是否可以正常显示,是否弹出警告或者多次进入而回到了登陆页面;
登录状态下,编辑页面是否可以正常显示,是否可以显示出编辑页面独有的元素;
登陆状态下,论坛帖子编辑功能是否正常
测试帖子分类模块,输入标题和内容,进行正常编辑功能测试;
只输入标题不输入内容,只输入内容不输入标题,以及标题和内容全都不输入的这三种情况,来进行异常编辑功能测试;

登录状态下

   /*** 场景2:登录状态下*/@Order(2)@ParameterizedTest@CsvSource(value = "linlin, 111111")void WriteBlog2(String username, String password) throws InterruptedException, IOException {//1-登录// 打开登录页面webDriver.get("http://127.0.0.1:58080/sign-in.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);//场景2:输入标题,内容为空,点击发布帖子按钮,获取警告信息//2-点击 发布帖子按钮#article_post_submitwebDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();//场景1:输入标题webDriver.findElement(By.cssSelector("#article_post_title")).sendKeys("标题");Thread.sleep(3000);//输入内容#edit-article > div.editormd-toolbar > div > ul > li:nth-child(20)webDriver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre")).sendKeys("内容");Thread.sleep(3000);//点击提交按钮webDriver.findElement(By.cssSelector("#article_post_submit")).click();//获取警告框信息System.out.println(webDriver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div")).getText());// 截图File srcFile =  ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);String fileName = "WriteBlogFailed.png";FileUtils.copyFile(srcFile, new File(fileName));}
}

未登录状态下:

/*** 场景1:未登录状态下,是否跳转回登录页面*/@Order(1)@Testvoid WriteBlog1() throws InterruptedException, IOException {//1-不登录,直接打开博客编辑页webDriver.get("http://127.0.0.1:58080/index.html");//获取当前的url地址String expect = "http://127.0.0.1:58080/sign-in.html";String actual = webDriver.getCurrentUrl();//判断是否跳转到登录界面webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertEquals(expect, actual);//截图File srcFile =  ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);String fileName = "WriteBlogFailed.png";FileUtils.copyFile(srcFile, new File(fileName));}

6.个人中心显示测试ForumPerson

登录状态下,进入博客列表页,点击我的帖子,跳转到个人中心页面,查看是否有用户昵称电话等信息。

登录状态下:

void BlogList2(String username, String password) throws InterruptedException, IOException {//1-登录// 打开登录页面webDriver.get("http://127.0.0.1:58080/sign-in.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);//2-点击我的帖子webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();Thread.sleep(1000);webDriver.findElement(By.cssSelector("#index_user_settings")).click();Thread.sleep(1000);//是否有用户昵称webDriver.findElement(By.cssSelector("#settings_nickname"));//是否有“昵称”这两个字webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(4)"));//是否有“邮箱地址”这几个字webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(7)"));//是否有“电话号码”这几个字webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(10)"));//是否有“修改密码”这几个字webDriver.findElement(By.cssSelector(" #bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(13)"));//是否有“提交修改”按钮#settings_input_passwordRepeatwebDriver.findElement(By.cssSelector("#settings_submit_password"));Thread.sleep(1000);//

异常登录状态下:

页面跳转到登录页面
在这里插入图片描述

7.退出操作测试ForumOut

点击右上角的头像点击退出,看是否到达登录页面

 @ParameterizedTest@CsvSource(value = "linlin, 111111")void LoginOut1(String username, String password) throws InterruptedException, IOException {//1-登录// 打开登录页面webDriver.get("http://127.0.0.1:58080/sign-in.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);//2-点击我的帖子webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();Thread.sleep(1000);//点击退出按钮webDriver.findElement(By.cssSelector("#index_user_logout")).click();Thread.sleep(1000);//获取当前的url地址String expect = "http://127.0.0.1:58080/sign-in.html";String actual = webDriver.getCurrentUrl();//判断是否跳转到登录界面webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertEquals(expect, actual);

8.驱动释放DriverQuiteTest

为了方便一整套测试流程的进行,也是为了节省资源,避免在每个类之后都进行驱动释放,这里我们新建了一个驱动释放类。,执行驱动释放操作可以释放驱动程序所占用的资源,包括内存、I/O资源、中断资源等,避免资源泄露和系统性能下降。

public class DriverQuit extends InitAndEnd {public static ChromeDriver webDriver = createDriver();@Testvoid DriverQuit(){webDriver.quit();}

3.代码测试:

全部测试通过
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.小结:

1.首先应该选择那些需要频繁执行的、重复性高的测试用例进行自动化。
2.维护良好的测试数据:确保测试数据的一致性和准确性,避免测试中出现因数据问题导致的误判。
3.等待页面加载:在自动化测试中,需要合理设置等待时间,以确保页面元素加载完成。可以使用隐式或显式等待方法来处理页面加载等待。
4.避免硬编码:在编写测试脚本时,避免硬编码,使用变量和参数化来提高脚本的可维护性和灵活性。
5.处理异常情况:在测试过程中,遇到异常情况时需要有相应的处理机制,添加断言、截图或日志记录.
6.平台和环境兼容性:考虑不同平台和环境的兼容性,确保自动化测试在各种场景下都能正常执行。
7.持续集成和持续部署:将自动化测试集成到持续集成和持续部署流程中,实现快速反馈和自动化输出。
9.出现编码问题时,可以仔细检查idea的编码设置,更改后要进行刷新。
10.要仔细对比前端每个测试的按钮的形式,跳转等
11.测试用例不是越多越好

6. 难点以及亮点

一、难点

很容易出现报错,对前端页面的不熟悉导致按钮使用的形式不正确,需要合理设置等待时间,以确保页面元素加载完成。可以使用隐式或显式等待方法来处理页面加载等待。避免硬编码,使用变量和参数化来提高脚本的可维护性和灵活性。

二、亮点

1.可重复执行:自动化测试脚本可以重复执行相同的测试用例,确保测试结果的一致性,同时方便团队随时随地进行测试。
2.支持多平台和多浏览器:自动化测试工具可以支持跨平台和跨浏览器测试,提高测试覆盖范围,确保软件在不同环境下的稳定性。
3.使用了JUnit5中提供的注解:避免生成过多的对象,造成资源和时间的浪费,提高了自动化的执行效率。
4. 只创建一次驱动对象,避免每个用例重复创建驱动对象造成时间和资源的浪费。
5. 使用参数化:保持用例的简洁,提高代码的可读性
6. 使用测试套件:降低了测试人员的工作量,通过套件一次执行所有要运行的测试用例。
7. 使用了等待:提高了自动化的运行效率,提高了自动化的稳定性,减小误报的可能性。
8.使用了屏幕截图:方便问题的追溯以及问题的解决
9.使用了公共类,继承,简化了代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.spring入门案例

Spring 介绍 Spring是轻量级的开源的JavaEE框架。 Spring有两个核心部分&#xff1a;IOC和AOP IOC 控制反转&#xff0c;把创建对象过程交给Spring进行管理。 AOP 面向切面&#xff0c;不修改源代码进行功能增强。 Spring特点 1.方便解耦&#xff0c;简化开发。 2.AOP编…

算法体系-25 第二十五节:窗口内最大值或最小值的更新结构

一 滑动窗口设计知识点 滑动窗口是什么&#xff1f; 滑动窗口是一种想象出来的数据结构&#xff1a; 滑动窗口有左边界L和有边界R 在数组或者字符串或者一个序列上&#xff0c;记为S&#xff0c;窗口就是S[L..R]这一部分 L往右滑意味着一个样本出了窗口&#xff0c;R往右滑意味…

【MySQL】库的操作【创建和操纵】

文章目录 1.创建数据库1.1字符集和校验规则1.查看系统默认字符集以及校验规则2.查看数据库支持的字符集以及校验规则 1.2校验规则对数据库的影响1.创建一个数据库&#xff0c;校验规则使用utf8_ general_ ci[不区分大小写]2.创建一个数据库&#xff0c;校验规则使用utf8_ bin[区…

flask的基本使用2

上一篇我们介绍了基本使用方法 flask使用 【 1 】基本使用 from flask import Flask# 1 实例化得到对象 app Flask(__name__)# 2 注册路由--》写视图函数 app.route(/) def index():# 3 返回给前端字符串return hello worldif __name__ __main__:# 运行app&#xff0c;默认…

idea的代码提示插件使用记录

安装ai插件卸载之后&#xff0c;偶尔还是idea一直占用100%&#xff0c;将idea缓存全清理了&#xff0c;重新生成之后就正常了 idea官方插件 下面几个感觉…基本没有感觉 按行提示的偶尔有提示&#xff0c;&#xff08;cpu占用不小&#xff0c;提示不强&#xff09; 缺点&am…

Sentinel解决雪崩问题

我们或多或少都对雪崩问题有点了解&#xff0c;在微服务系统中&#xff0c;各个微服务互相调用&#xff0c;关系错综复杂&#xff0c;如果其中一个微服务挂了或者处理消息的速度大幅下降&#xff0c;需要被处理的消息越积越多&#xff0c;那么影响的不仅仅是本微服务的功能&…

C++ | Leetcode C++题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> rightmostValueAtDepth;int max_depth -1;stack<TreeNode*> nodeStack;stack<int> depthStack;nodeStack.push(ro…

SCI二区|北极海鹦优化算法(APO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;W Wang受到北极海鹦的生存和捕食行为启发&#xff0c;提出了北极海鹦优化算法&#xff08;Arctic Puffin Optimization, APO&#xff09;。 2.算法原理 2.1算法思想 …

Tcmalloc工具定位内存泄漏问题

内存泄漏问题定位 gperftools工具安装 执行如下操作&#xff1a; git clone https://github.com/gperftools/gperftools.git 注&#xff1a;如果网速较慢&#xff0c;可直接去下载压缩包。 如我下载的地址&#xff1a;https://github.com/gperftools/gperftools/releases/ta…

SA 注册流程

目录 1. UE开机后按照3GPP TS 38.104定义的Synchronization Raster搜索特定频点 2.UE尝试检测PSS/SSS&#xff0c;取得下行时钟同步&#xff0c;并获取小区的PCI&#xff1b;如果失败则转步骤1搜索下一个频点&#xff1b;否则继续后续步骤&#xff1b; 3.解析Mib&#xff0c;…

WDG看门狗

1 WDG 1.1 简介 WDG是看门狗定时器&#xff08;Watchdog Timer&#xff09;的缩写&#xff0c;它是一种用于计算机和嵌入式系统中的定时器&#xff0c;用来检测和恢复系统故障。 看门狗就像是一个忠诚的宠物狗&#xff0c;它时刻盯着你的程序&#xff0c;确保它们正常运行。…

SpringBoot启动出错:无法访问org.springframework.boot.autoconfigure.SpringBootApplication

无法访问org.springframework.boot.autoconfigure.SpringBootApplication类文件具有错误的版本 61.0&#xff0c;应为 52.0请删除该文件或确保该文件位于正确的类路径子目录中。 出现该问题是由于版本不兼容&#xff0c; 在pom.xml文件中&#xff0c;修改版本为2开头即可

一个用于Win的自动复制文本的工具:Auto_Copy

自动复制工具 这是一个用在 Windows 上的的小工具,会将你选中的任何文本保存下来,可以通过点击右键粘贴选中内容。 一、灵感来源: 在使用Mobaxterm时,我注意到其软件中具备选中即自动复制和右键直接粘贴的功能。但是,这种选中自动复制的功能仅在软件内部有效。由于这一功…

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】 1.1 什么是高斯金字塔&#xff1f; 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;是一种多分辨率图像表示方法&#xff0c;用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作&#x…

RTMP推流到SRS流媒体服务器消息处理

RTMP推流到SRS流媒体服务器消息处理 SRS和客户端是怎么交换消息的&#xff1f;各个消息有什么作用&#xff1f;握手成功后&#xff0c;SRS和客户端进行消息交换&#xff0c;对应wiresharek这部分截图&#xff1a; 流程图&#xff08;之前画的&#xff0c;可能不够详细&#xf…

在Linux (Ubuntu 16) 下安装LabVIEW

用户尝试在Ubuntu 16操作系统上安装LabVIEW&#xff0c;但找不到合适的安装文件来支持Ubuntu。已经下载了运行时文件&#xff0c;并尝试将.rpm包转换为.deb包并安装在Ubuntu上。然而&#xff0c;安装完成后&#xff0c;没有在应用程序中看到LabVIEW的图标。 用户希望能够在Ubu…

【操作系统】内存管理——页面分配策略(个人笔记)

学习日期&#xff1a;2024.6.28 内容摘要&#xff1a;页面分配策略和内存映射文件&#xff0c;内存映射文件 页面分配置换策略 基本概念 驻留集&#xff0c;指请求分页存储管理中给进程分配的物理块的集合&#xff0c;在采用了虚拟存储技术的系统中&#xff0c;驻留集大小一…

springcloud第4季 分布式事务seata实现AT模式案例2【经典案例】

一 seata案例 1.1 背景说明 本案例使用seata的at模式&#xff0c;模拟分布式事务场景&#xff1a;【下订单&#xff0c;减库存&#xff0c;扣余额&#xff0c;改状态】 AT模式原理&#xff1a;是2pc方案的演变&#xff0c; 一阶段&#xff1a;业务数据和回滚日志记录在同一…

Android studio 打包低版本的Android项目报错

一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…

static修饰的对象在内存中的存储及其用法

一、static修饰的变量在内存中的存储位置 static关键字无论是在C语言还是C中都有着极其重要的作用&#xff0c;那么对于static来说&#xff0c;它修饰的对象是存储在内存的哪个位置呢&#xff1f;它的作用与它在内存中的位置有什么联系&#xff1f;还有它都适用于哪些场景&…