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

news2024/11/23 15:27:15

论坛系统项目自动化测试

  • 前述
  • 一、脑图
  • 二、代码编写
    • 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;
    @BeforeAll
    static void SetUp(){
        webDriver=new ChromeDriver();

    }
    @AfterAll
    static 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 > a
        webDriver.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 > a
        webDriver.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
     */

    @Test
    void 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 > div
        String 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("跳转到边界帖子页面");


未登录状态下:

 /**
     * 未登录状态下,进入博客列表页,是否跳转回登录页面
     */
   
    @Test
    void 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_submit
        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();
        //场景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)
    @Test
    void 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_passwordRepeat
        webDriver.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();
    @Test
    void 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.coloradmin.cn/o/1879942.html

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

相关文章

<电力行业> - 《第10课:变电》

1 变电 变电环节&#xff0c;顾名思义就是改变电压的环节&#xff0c;主要是在变电站和变电所完成的。变电站和变电所主要区别在于&#xff1a;变电站比变电所更大。 发电厂的变压器和配电变压器也属于“变电”&#xff0c;但我们在说电网环节时&#xff0c;变电特指电网公司…

python基础:设置代码格式

随着编写的程序越来越长&#xff0c;有必要了解一些代码格式的约定&#xff0c;让你的代码尽可以能易于阅读。 python代码编写规范为PEP8&#xff0c;有兴趣的朋友可以下载观看&#xff0c;这里仅作简要说明。 1、缩进 PEP8建议每级缩进都使用4个空格。多数情况下编程语言的…

无人机智能追踪反制系统技术详解

随着无人机技术的飞速发展&#xff0c;无人机在各个领域的应用越来越广泛。然而&#xff0c;无人机的无序飞行和非法使用也带来了一系列安全隐患和威胁。因此&#xff0c;无人机智能追踪反制系统应运而生&#xff0c;成为维护公共安全和防止无人机滥用的重要工具。本文将详细介…

深度学习评价指标:Precision, Recall, F1-score, mIOU, 和 mDice

在深度学习和机器学习中&#xff0c;评价模型性能是至关重要的一环。本文将详细讲解一些常见的评价指标&#xff0c;包括精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1-score、平均交并比&#xff08;mIOU&#xff09;和平均Dice系数&am…

ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介 ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表&#xff08;HashMap&#xff09;实现。它具有以下几个显著的特点和优点&#xff0c;适合在特定的并发场景中使用&#xff1a; 线程安全性&#xff1a; ConcurrentHashMap 提供了并发访问的线程安全保证&am…

AWT的菜单组件

AWT的菜单组件 前言一、菜单组件的介绍常见的菜单相关组件常见菜单相关组件集成体系图菜单相关组件使用小要点 二、AWT菜单组件的代码示例示例一示例二实现思路 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&…

高考结束,踏上西北的美食之旅

高考的帷幕落下&#xff0c;暑期的阳光洒来&#xff0c;是时候放下书本&#xff0c;背上行囊&#xff0c;踏上一场充满期待的西北之旅。而在甘肃这片广袤的土地上&#xff0c;除了壮丽的自然风光&#xff0c;还有众多令人垂涎欲滴的美食等待着您的品尝。当您踏入甘肃&#xff0…

创建一个vue3+vite+ts项目

目录 创建项目 ​编辑 下载jsx 插件 在根目录在新建.env vue.config.js tsconfig.json tsconfig.node.json 下载ui组件库和路由&#xff08;组件库根据自己的项目需要选择&#xff09; 在根目录下新建views/index.tsx 在根目录下新建router/index.ts 修改App.vue 创建…

【C++】C++ 网店销售库存管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

K8S之网络深度剖析(一)(持续更新ing)

K8S之网络深度剖析 一 、关于K8S的网络模型 在K8s的世界上,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的为每个Pod都设置一个IP地址的模型也被称作为I…

What does the error ‘module ‘langchain‘ has no attribute ‘verbose‘ refer to?

题意&#xff1a;错误 module langchain has no attribute verbose 指的是什么意思&#xff1f; 问题背景&#xff1a; Kind of new to Langchain/Qdrant but Im building a recommendation engine to recommend users based on the contents of their associated PDF files, …

Docker配置远程连接

前置条件&#xff1a;docker所在的服务器开放2375端口 文件&#xff1a;/usr/lib/systemd/system/docker.service 节点ExecStart 追加 -H tcp://0.0.0.0:2375

allure安装教程

1、下载 allure的官网下载地址&#xff1a; https://github.com/allure-framework/allure2/releases 注意&#xff1a;官网时常访问失败&#xff0c;可以访问以下网址&#xff1a; https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/ 选择一个版本&…

岗位实习最终篇(汇总)——人力资源管理系统(包含DDL,DML,视图,简单/复杂查询,触发器语句和存储过程语句)

DDL CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 员工ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,first_name VARCHAR(50) NOT NULL COMMENT 名,last_name VARCHAR(50) NOT NULL COMMENT…

leetCode.97. 交错字符串

leetCode.97. 交错字符串 题目思路 代码 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int n s1.size(), m s2.size();if ( s3.size() ! n m ) return false;vector<vector<bool>> f( n 1, vector<bool> (m 1));s1 …

【大数据导论】大数据序言

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 数据概念及类型及可用及组织形式数据概念数据…

阿里云oss实现图片上传

Bucket&#xff1a;存储空间是用户用于存储对象&#xff08;Object&#xff0c;就是文件&#xff09;的容器&#xff0c;所有的对象都必须隶属于某个存储空间。 SDK&#xff1a;Software Development Kit 的缩写&#xff0c;软件开发工具包&#xff0c;包括辅助软件开发的依赖…

黄冈师范学院2024年成人高等继续教育招生简章

黄冈师范学院&#xff0c;这座矗立在湖北黄冈的教育殿堂&#xff0c;以其深厚的文化底蕴和卓越的教学质量&#xff0c;吸引了无数求学者。如今&#xff0c;随着社会的快速发展和教育的不断进步&#xff0c;黄冈师范学院再次敞开怀抱&#xff0c;热烈迎接2024年成人高等继续教育…

详解flink sql, calcite logical转flink logical

文章目录 背景示例FlinkLogicalCalcConverterBatchPhysicalCalcRuleStreamPhysicalCalcRule其它算子FlinkLogicalAggregateFlinkLogicalCorrelateFlinkLogicalDataStreamTableScanFlinkLogicalDistributionFlinkLogicalExpandFlinkLogicalIntermediateTableScanFlinkLogicalInt…

原来“山水博客“的分类也是可以拖动排序的

这二天一直用“山水博客”写文章&#xff0c;发现一个问题&#xff0c;好象它的分类不能调整位置&#xff0c;这可是个大bug。首先&#xff0c;界面上没发现拖动相关按钮&#xff1b;如果按住分类拖动&#xff0c;会成这样&#xff1a; 后来仔细看了它的文档&#xff0c;发现它…