详解自动化之单元测试工具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("这是一个测试方法");
    }

    @Test
    static void aaa(){
        System.out.println("aaa");
    }
    @Test
    void bbb(){
        System.out.println("bbb");
    }
}

1.2 @BeforeEach

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

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

1.3 @BeforeAll

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

    @Test
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }

    @BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
//    @Test
    static void aaa(){
        System.out.println("aaa");
    }
    @Test
    void bbb(){
        System.out.println("bbb");
    }

1.4 @AfterEach

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

    @Test
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }

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

1.5 @AfterAll

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

    @Test
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }

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

注意:

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

 

2. 用例的执行顺序

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

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

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

通过 @order() 注解来排序

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

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)// 通过 order 来排序
public class JunitTest {
    @Order(1)
    @Test
    void editloginTest(){
    System.out.println("loginTest");
    }
    @Order(3)
    @Test
    void AindexTest(){
        System.out.println("indexTest");
    }
    @Order(2)
    @Test
    void 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(期待得到对象,实际得到)

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

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

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

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

    @Test
    void 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("你好");//通过
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决vue element - ui 弹窗打开表单自动校验问题

1 打开弹窗清除自动校验 在data 里面把所有表单字段都定义一下 2 弹窗关闭事件 清除校验

Vue批量全局处理undefined和null转为““ 空字符串

我们在处理后台返回的信息&#xff0c;有的时候返回的是undefined或者null&#xff0c;这种字符串容易引起用户的误解&#xff0c;所以需要我们把这些字符串处理一下。 如果每个页面都单独处理&#xff0c;那么页面会很冗余&#xff0c;并且后期如果有修改容易遗漏&#xff0c…

Banana Pi BPI-R3 Mini 开源路由器,也能拍出艺术美感

香蕉派BPI-R3 Mini路由器板开发板采用联发科MT7986A(Filogic 830)四核ARM A53芯片设计&#xff0c;板载2G DDR 内存&#xff0c;8G eMMC和128MB SPI NAND存储&#xff0c;是一款非常高性能的开源路由器开发板&#xff0c;支持Wi-Fi6 2.4G/5G&#xff08;MT7976C&#xff09;&am…

ImportError: Unknown magic number 3495 in test.pyc

在进行pyc文件反编译时遇到如下报错&#xff1a; 这个问题是我们生成的pyc文件本身存在的问题 pyc文件生成时&#xff0c;头部的magic number被清理&#xff0c;需要我们另外补上。 我们先观察对比一下正确的pyc文件头与报错的pyc文件头&#xff1a; 正常的pyc文件 丢头部的…

开源之夏 2023 | Databend 社区项目总结与分享

开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;助力开源软件供应链建设。 官…

requests库中解决字典值中列表在URL编码时的问题

本文将探讨 issue #80 中提出的技术问题及其解决方案。该问题主要涉及如何在模型的 _encode_params 方法中处理列表作为字典值的情况。 问题背景 在处理用户提交的数据时&#xff0c;有时需要将字典序列化为 URL 编码字符串。在 requests 库中&#xff0c;这个过程通常通过 pa…

java springboot测试类鉴定虚拟MVC运行值与预期值是否相同

好 上文java springboot在测试类中构建虚拟MVC环境并发送请求中 我们模拟的MVC环境 发送了一个请求 我们这次需要 对比 预期值和运行值是否一直 这里 我们要用一个 MockMvcResultMatchers 他提供了非常多的校验类型 例如 请求有没有成功 有没有包含请求头信息 等等 这里 我们做…

CSGO市场下跌分析,是跑还是入?

CSGO饰品下跌分析&#xff0c;是“跑”还是“入”&#xff1f; CSGO市场下跌分析&#xff0c;是跑还是入&#xff1f; 以下所有都是童话本人最近几年观察市场和踩坑的一点经验&#xff0c;由于篇幅不长所以肯定会很浅薄&#xff0c;大伙下嘴轻点 。 首先现在真的是CSGO市场最…

B站已经部分上线前台实名,如不同意实名,后期账号流量将收影响!

B站部分百万粉丝博主的主页显示账号运营人名字的政策是从10月31日开始的。当天&#xff0c;B站官方发布了《哔哩哔哩关于头部“自媒体”账号前台实名的公告》&#xff0c;表明了其前台实名制的实施计划。 B站部分上线前台实名的过程可以追溯到2021年。当时&#xff0c;中国政府…

网上找客户有什么渠道?

在数字化时代&#xff0c;企业和个体创业者需要善于利用互联网来拓展业务和寻找潜在客户。网上找客户的渠道多种多样&#xff0c;合理运用这些渠道可以极大地提高曝光和业务机会。以下是一些成功寻找客户的网上渠道&#xff1a; 1. 社交媒体平台 社交媒体已成为建立专业形象和…

AppLink结合金蝶云星空作订单信息同步流程

此次通过AppLink&#xff0c;根据请求数据金蝶云星空做销售订单信息同步拉取 在获取订单信息前需要得到金蝶云星空授权&#xff0c;详细授权步骤可查看&#xff1a;金蝶云星空授权指南 根据请求数据在金蝶云星空保存销售订单 当webhook接收到数据时触发流程 步骤1&#xff…

13、深度学习之神经网络

深度学习是机器学习中重要的一个学科分支,它的特点就在于需要构建多层“深度”的神经网络。 人们在探索人工智能初期,就曾设想构建一个用数学方式来表达的模型,它可以模拟人的大脑,大脑我们都知道,有很多神经元,每个神经元之间通过突触链接。 神经网络的设计就是模仿了这…

Youtube新手运营——你需要的技巧与工具

对于有跨境意向的内容创作者或者品牌企业来说&#xff0c;YouTube是因其巨大的潜在受众群和商业价值成为最值得投入变现与营销计划的平台。 据统计&#xff0c;98% 的美国人每月访问 YouTube&#xff0c;近三分之二的人每天访问。但是&#xff0c;YouTube还远未达到过度饱和的…

真菌基因组研究高分策略(一):比较基因组揭示真菌菌丝和多细胞的起源

真菌是陆地和水生生态系统的重要组分&#xff0c;在有机质循环和跨营养级养分流通等过程中发挥着重要作用。随着测序技术的发展&#xff0c;高通量测序揭示了真菌群落巨大的系统发育和功能多样性&#xff0c;高质量真菌基因组的组装已经成为研究菌丝和潜在基因的进化起源的有力…

分享五款可视化数据平台,零代码也能轻松上手!

今天给大家推荐五款市面上常见的可视化数据平台&#xff0c;不仅可以做日常的图表&#xff0c;制作可视化大屏也不在话下&#xff0c;考虑到一些非技术人员的需求&#xff0c;我把这些数据可视化平台分为代码类和零代码类&#xff0c;大家可以根据需要选择最合适自己的工具。 …

气死了,过五关,斩六将,结果被 HR 捅了一刀!!

Hello&#xff0c;大家好&#xff0c;我是 Sunday。 大家有没有遇到过这样的事情&#xff1a;“过五关&#xff0c;斩六将。通过了两轮、甚至是三轮的技术面&#xff0c;最后 HR 面被“捅死”了” 这样的事情&#xff0c;最近在一位同学身上连续出现了两次&#xff0c;弄得人…

12、人工智能、机器学习、深度学习的关系

很多年前听一个机器学习的公开课,在Q&A环节,一个同学问了老师一个问题“机器学习和深度学习是什么关系”? 老师先没回答,而是反问了在场的同学,结果问了2-3个,没有人可以回答的很到位,我当时也是初学一脸懵,会场准备的小礼品也没有拿到。 后来老师解释“机器学习和…

orvibo的Mini网关VS20ZW玩法

概述 闲鱼淘来一个2016年生产的网关,此网关的型号:VS20ZW。 已经不能用APP入网了,没事拆来玩玩。 此设备已经被淘汰,很多新的zigbee产品不再支持入网。 官网设备的简介: ZigBee Mini网关,智能家居网关,智能家居主机|ORVIBO欧瑞博智能网关 设备概貌: 主要器件: …

每日OJ题_算法_双指针_力扣202. 快乐数

力扣202. 快乐数 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为…

每日一练:“打家劫舍“(House Robber)问题 I

1. 问题 假设有一排房屋&#xff0c;每个房屋里都存放着一定数量的财宝。相邻的房屋装有相互连通的防盗系统&#xff0c;如果两个相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。   求解的问题是&#xff0c;小偷在不触发警报的情况下&#xff0c;一晚上最多能偷…