详解自动化之单元测试工具Junit

目录

1.注解

1.1 @Test

1.2 @BeforeEach

1.3 @BeforeAll

1.4 @AfterEach

1.5 @AfterAll

2. 用例的执行顺序

通过 @order() 注解来排序

3. 参数化

3.1 单参数

3.2 多参数

3.3 多参数(从第三方csv文件读取数据源)

3.4 动态参数@ParameterizedTest + @MethodSource()

4. 测试套件

4.1 指定类来运行实例@Suite + @SelectClasses

4.2 指定包名来运行包下所有测试用例

5. 断言 Assertions类

5.1 断言匹配/不匹配Assertions.assertEquals()

5.2 断言结果为真/假Assertions.assertTrue()

5.3 断言结果为空/非空Assertions.assertNull()


 

自动化就是 selenium 脚本来实现的,junit 是 java 的单元测试工具,只不过在实现自动化的时候需要借用一下 junit 库里面提供的一些注解

注:博主的版本为 Junit5,支持的 Java 版本最低要为 8

添加依赖:

<dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope>
</dependency>

1.注解

1.1 @Test

@Test 表示当前方法为测试方法,执行这个类的时候会自动执行这个注释下的所有方法

public class JunitTest {@Test//表示当前方法是测试方法,执行这个类时会自动执行这个类下的所有带 @Test 注解的用例void baseZhujie(){System.out.println("这是一个测试方法");}@Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
}

1.2 @BeforeEach

@BeforeEach 当前方法需要在每个用例执行之前都执行一遍

    @BeforeEach// 表示当前方法需要在每个用例执行之前都执行一遍
//    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.3 @BeforeAll

@BeforeAll 表示当前方法需要在所有用例执行之前执行一次

    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
//    @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.4 @AfterEach

@AfterEach 表示当前发给发需要在每个用例执行之后都执行一遍

    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍
//    @Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.5 @AfterAll

@AfterAll 表示当前用例需要在每个用例执行之后执行一遍

    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}//    @BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
//    @AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍@AfterAll// 当前方法需要在所有用例执行之后执行一次
//    @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

注意:

@BeforeAll 和 @AfterAll 修饰的方法需要用 static 进行修饰才能正常运行

 

2. 用例的执行顺序

在先前我一直以为用例的执行顺序是按照排列顺序来执行的:

对比这两个实例中的用例的执行顺序,我又产生了是不是按照方法名的字母顺序来执行的呢?

但是后面我才了解到官方网站是并没有说明用例默认的执行顺序的!!

通过 @order() 注解来排序

  1. 要先使用注解说明当前类下所有的用例需要使用 order 注解来进行排序
  2. 然后通过 Order 来指定用例的具体执行顺序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)// 通过 order 来排序
public class JunitTest {@Order(1)@Testvoid editloginTest(){System.out.println("loginTest");}@Order(3)@Testvoid AindexTest(){System.out.println("indexTest");}@Order(2)@Testvoid editTest(){System.out.println("editTest");}
}

3. 参数化

目的:尽可能的用一个用例来模拟多个用户的行为

3.1 单参数

@ParameterzedTest + @ValueSource(数据类型方法 = {参数1,参数2,参数3,…})

    //声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@ValueSource(strings = {"lucky","mary","tom"})void methodPramsTest(String username){System.out.println("name:" + username );}

3.2 多参数

@parameterizedTest + @CsvSource({“”, “”, '", …}) 每个双引号就是一组测试用例

    //声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@CsvSource({"张三,123","李四,123","王五,123"})//多参数(从注解中手动编写数据源)void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}

3.3 多参数(从第三方csv文件读取数据源)

@ParameterizedTest + @CsvFileSource(files = “文件路径+名字”)

这里的这个 csv 文件,不要直接改后缀生成,要用系统自带的 Excel 工具,来打开和编辑 csv 文件

这里出现乱码的情况就是因为没有使用电脑系统自带的Excel来编辑

3.4 动态参数@ParameterizedTest + @MethodSource()

@ParameterizedTest + @MethodSource("方法名")

    @ParameterizedTest@MethodSource("paramSupport")void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}static Stream<Arguments> paramSupport() throws InterruptedException {//构造动态参数String[] arr = new String[5];for (int i = 0; i < arr.length; i++) {Thread.sleep(500);arr[i] = System.currentTimeMillis() + "";}return Stream.of(Arguments.arguments(arr[0],10),Arguments.arguments(arr[1],14),Arguments.arguments(arr[2],13),Arguments.arguments(arr[3],12),Arguments.arguments(arr[4],11));}

注意:当@MethodSource不指定数据源时,会自动寻找与用例方法名相同的静态方法

4. 测试套件

当我们需要测试多个类中的用例时,如果一个类一个类的去运行,那是非常耗时耗力的,

如果我们能够同时运行多个类就很好,所以可以使用测试套件来同时运行多个测试类

4.1 指定类来运行实例@Suite + @SelectClasses

//标识为测试套件类,而不是测试类
@Suite
@SelectClasses({aaa.class,bbb.class,ccc.class})//指定类
public class runSuite {}

注意:想要用例被运行,用例必须要被 @Test 修饰

4.2 指定包名来运行包下所有测试用例

//标识为测试套件类,而不是测试类
@Suite
@SelectPackages("com.junit1121")//指定包名运行包下所有用例
public class runSuite {}

但是我们的运行结果为:

在这里类 aaa,bbb,ccc  中的用例都没有正常运行

那是因为:        

如果使用包名来指定运行的范围,那么该包下来所有的测试类的命名需要以Test/Tests结尾(T必须要大写)

 

 

5. 断言 Assertions类

5.1 断言匹配/不匹配Assertions.assertEquals()

断言匹配:Assertions.assertEquals(期待得到对象,实际得到)

断言不匹配:Assertions.assertNotEquals(期待得到对象,实际得到)

    @Testvoid TestBefo(){ChromeDriver driver = new ChromeDriver();driver.get("https://www.baidu.com");String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");//百度一下// 假如这里获取到的值不是“百度一下”而是“搜狐一下”这就是一个bugSystem.out.println(test);// 断言// 断言匹配/不匹配Assertions.assertEquals("搜狐一下",test);driver.quit();}

5.2 断言结果为真/假Assertions.assertTrue()

断言结果为真:Assertions.assertTrue()

断言结果为假:Assertions.assertFalse()

    @Testvoid ddd(){// 断言结果为真/假
//        Assertions.assertTrue(1==1);Assertions.assertFalse(1==0);}

5.3 断言结果为空/非空Assertions.assertNull()

断言结果为空:Assertions.assertNull()

断言结果为非空:Assertions.assertNotNull()

@Test
void ggg() {String aaa = null;Assertions.assertNull(aaa);//通过
}
@Test
void hhh() {Assertions.assertNotNull("你好");//通过
}

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

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

相关文章

二、Gitee使用方法

目录 &#xff08;1&#xff09;首先可以注册一个 gitee 账号&#xff0c;注册很方便&#xff0c;自行注册 &#xff08;2&#xff09;登陆后进入你的主页 &#xff08;3&#xff09;创建仓库 &#xff08;3&#xff09;克隆 &#xff08;4&#xff09;代码提交 &#xf…

【机器学习】贝叶斯分类器

贝叶斯分类器是一种概率模型&#xff0c;利用贝叶斯公式来解决分类问题。假设样本的特征向量服从一定的概率分布&#xff0c;我们就可以计算出该特征向量属于各个类的条件概率。分类结果是条件概率最大的分类结果。如果假设特征向量的每个分量彼此独立&#xff0c;则它是朴素贝…

代码混淆不再愁:一篇掌握核心技巧

​ 1. 概述 代码混淆是将计算机程序的代码转换成一种功能上等价&#xff0c;但是难以阅读和理解的形式。 对于软件开发者来说&#xff0c;代码混淆可以在一定程度上保护程序免被逆向。 对于逆向工程师来说&#xff0c;学习代码混淆可以帮助我们研究反混淆技术。 2. 常见混淆…

金蝶云星空部署包导出文件

文章目录 金蝶云星空部署包导出文件 金蝶云星空部署包导出文件 打开补丁包后&#xff0c;贴入导出文件的文件夹&#xff0c;然后按F2即可导出到目标文件夹。

【HTML + CSS】 实现原神纯静态官网

文章目录 一、网页效果演示 二、poster code 2.1、html: <!-- 页面一 --> <div class"poster"> <!-- 头部导航栏 --> <div class"header_bar"> <!-- 头部左边&#xff0c;logo --> <div class&…

springboot宠物领养系统-计算机毕设 附源码 44261

springboot宠物领养系统 摘 要 网络发布信息有其突出的优点&#xff0c;即信息量大&#xff0c;资源丰富&#xff0c;更新速度快等&#xff0c;很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个网上宠物领养系统&#xff0c;为宠物爱好者提供一个信息…

AI:86-基于深度学习的街景图像地理位置识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

PostgreSQL导出表结构带注释

我们在平时开发过程中&#xff0c;经常会在字段的注释中&#xff0c;加上中文&#xff0c;解释字段的相关含义&#xff0c;也可以避免时间太久忘记这个字段代表什么&#xff0c;毕竟英文水平不好。我们可能要经常整理数据库表结构&#xff0c;提供他人去收集数据&#xff0c;但…

提升企业人效,从精细化考勤管理开始

过去&#xff0c;许多企业提到考勤管理&#xff0c;只能关联到打卡、请假、算薪这些简单的事务性流程。随着越来越多企业希望通过数字化转型来提升运营效率&#xff0c;实现精细化人员管理。考勤数据的作用也不再仅限于算薪&#xff0c;而是成为了企业分析人效的关键因子。因此…

【shell】循环语句(for、while、until)

目录 一、循环语句的特点 二、三种常用的循环 2.1 for循环 2.2 while循环 2.3 until循环 2.4 死循环 2.5 关于continue和break以及exit 三、实操案例 3.1 累加1到100&#xff08;5种办法&#xff0c;穿插多种运算习惯&#xff09; 3.2 批量修改文件名称 3.3 pi…

vue3中v-for报错 ‘item‘ is of type ‘unknown‘

报错 在写vue3ts的项目&#xff0c;得到一个数组&#xff0c;需要循环展示&#xff0c;使用v-for循环&#xff0c;写完之后发现有个报错&#xff0c;如下&#xff1a; 解决 props的时候使用PropType将数据类型完整标注即可 以为没有显示的表示出list中item的类型&#xff…