当前位置: 代码网 > it编程>编程语言>Php > 【软件测试开发】Junit5单元测试框架

【软件测试开发】Junit5单元测试框架

2024年08月02日 Php 我要评论
Junit5单元测试框架


● 实现自动化测试需要 selenium基本语法+junit单元测试框架才能完成自动化测试
junit是一个开源的java语言的单元测试框架,junit是java方向使用最广泛的单元测试框架,使用java开发者都应当学习junit并且掌握单元测试的编写

selenium和junit:假如要实现一个灯泡,selenium就是灯泡,junit就是电源

首先需要在pom文件中引入junit依赖:

    <dependencies>
        <dependency>
            <groupid>org.seleniumhq.selenium</groupid>
            <artifactid>selenium-java</artifactid>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupid>commons-io</groupid>
            <artifactid>commons-io</artifactid>
            <version>2.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupid>org.junit.jupiter</groupid>
            <artifactid>junit-jupiter</artifactid>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher -->
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite-api -->
        <dependency>
            <groupid>org.junit.platform</groupid>
            <artifactid>junit-platform-suite</artifactid>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupid>org.junit.platform</groupid>
            <artifactid>junit-platform-reporting</artifactid>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>


    </dependencies>

1. 注解

@test 注解

@test 能够表示一个方法/用例
在不引入注解的情况下执行测试方法需要在java main方法中去执行,使用注解之后只需要在要执行的测试方法上面加上 @test 注解即可直接进行测试方法的执行:

public class junitautotest {
   private final chromedriver chromedriver=new chromedriver();
   public void start(){
       chromedriver.get("https://www.baidu.com/");
   }
   @test
    public void zhujietest() throws interruptedexception {
       start();
       chromedriver.findelement(by.cssselector("#kw")).sendkeys("junit");
       chromedriver.findelement(by.cssselector("#su")).click();
       thread.sleep(3000);
       end();
    }
    public void end(){
       chromedriver.quit();
    }
}

不需要再次创建一个runtest类来执行,大大加快了测试执行;

@beforeeach @beforeall

@beforeeach :表示被注解的方法应该在其他方法执行之前都执行一遍

public class junitautotest {

    @beforeeach
    public void aaa(){
        system.out.println("pre");
    }

    @test
    public void bbb(){
        system.out.println("bbb");
    }

    @test
    public void ccc(){
        system.out.println("ccc");
    }
    
}

在 aaa 方法上加了 @beforeeach 注解表示在执行 bbb,ccc方法之前都会各自执行一次aaa方法,打印 pre:
在这里插入图片描述
@beforeall :表示在其他方法执行之前只需要执行一遍
● 使用 @beforeall 注解的方法必须定义为static静态方法

public class junitautotest {

    @beforeall // 必须定义为static方法,否则报错
    public static void aaa(){
        system.out.println("pre");
    }

    @test
    public void bbb(){
        system.out.println("bbb");
    }

    @test
    public void ccc(){
        system.out.println("ccc");
    }

}

在执行 bbb ccc 方法之前先执行一遍 aaa 方法,只打印一次 pre:
在这里插入图片描述

@aftereach @afterall

用法和之前的 @beforeeach 和 @beforeall 类似,表示注解的方法应该在其他方法执行之后执行:
@aftereach:表示被注解的方法应该在其他方法执行之后都执行一遍:

public class junitautotest {

    @aftereach
    public  void aaa(){
        system.out.println("pre");
    }

    @test
    public void bbb(){
        system.out.println("bbb");
    }

    @test
    public void ccc(){
        system.out.println("ccc");
    }

}

在这里插入图片描述
@afterall:表示在其他方法执行之后只需要执行一遍
● 使用 @afterall 注解的方法必须定义为static静态方法

public class junitautotest {

    @afterall
    public  static void aaa(){
        system.out.println("pre");
    }

    @test
    public void bbb(){
        system.out.println("bbb");
    }

    @test
    public void ccc(){
        system.out.println("ccc");
    }

}

在这里插入图片描述

2. 断言 assert

写自动化测试,结果分为成功或者失败的,怎么评判结果是成功还是失败,就需要用到 assert 断言操作

assertequals

● assertequals(expect,actual)

public class asserttest {
    private final chromedriver chromedriver=new chromedriver();

    /**
     * 测试百度首页元素是否正确
     */
    @test
    void equalstest(){
        chromedriver.get("https://www.baidu.com/");
        string value = chromedriver.findelement(by.cssselector("#su")).getattribute("value");
        assertions.assertequals("百度一下",value);

    }
}

断言成功:
在这里插入图片描述
断言失败:
在这里插入图片描述
同理还可以判断不相等:assertnotequals

    @test
    void equalstest(){
        chromedriver.get("https://www.baidu.com/");
        string value = chromedriver.findelement(by.cssselector("#su")).getattribute("value");
        assertions.assertnotequals("百s度一下",value);
        chromedriver.quit();

    }

此时不相等,断言成功:
在这里插入图片描述

asserttrue assertfalse

asserttrue assertfalse 参数是表达式,也就是boolean类型的

  @test
    void asserttruetest(){
        chromedriver.get("https://www.baidu.com/");
        string value = chromedriver.findelement(by.cssselector("#su")).getattribute("value");
        assertions.asserttrue(value.equals("百度一下")); // true 执行通过
        chromedriver.quit();

    }

assertfalse 同理

assertnull assertnotnull

   @test
    void assertnull(){
        string a=null;
        assertions.assertnull(a);
    }

a是null,执行通过

 @test
    void assertnull(){
        string a=null;
        assertions.assertnotnull(a);
    }

a是null,执行不通过
在这里插入图片描述

3. 用例执行顺序

junit默认执行顺序是不确定的,官方文档没有明确给出
官方文档地址:https://junit.org/junit5/
但是我们仍然可以使用junit里提供的方法来手动设置用例的执行顺序
文档中给出的排序方法非常多,诸如方法的排序,标签的排序。。。。

方法排序,通过 @order 注解来排序

当多个测试用例之间没有解耦,存在前后关联关系,就需要手动指定用例的执行顺序,否则就无法控制用例的执行先后顺序出现错误

@testmethodorder(methodorderer.orderannotation.class) // 标注当前类使用方法来进行排序
public class runordertest {
    @test
    @order(1) // 明确标注具体执行顺序
    void print(){
        system.out.println("aaa");
    }
    @test
    @order(2)

    void show(){
        system.out.println("bbb");
    }
    @test
    @order(3)

    void dayin(){
        system.out.println("ccc");
    }
    @test
    @order(4)

    void shuchu(){
        system.out.println("ddd");
    }
}

所以在编写测试用例时候尽量保持测试用例的独立性,如果存在关联关系记得手动指定用例的执行顺序
● @testmethodorder(methodorderer.orderannotation.class) +
@order(顺序)

4. 测试套件 suite

平时执行一次单元测试只能执行一个类,要是想一次性执行多个类中的测试用例方法,就需要用到测试套件

  1. 指定类,添加到套件中并执行
    在这里插入图片描述
    打包执行成功:
    在这里插入图片描述
  2. 选择指定的包,添加到套件中执行
    ● 使用指定的包来添加套件的前提,所有的文件都需要以test,tests命名(包含),同时我们的用例都必须要加上 @test 注解
    在这里插入图片描述
    在这里插入图片描述
    包里面的类命名要带上 test 才能够被识别到
    打包执行成功:
    在这里插入图片描述

5. 参数化单参数

参数化用到的注解: @parameterizetest 标注方法类型为参数化
强调参数的来源:
需要添加参数的来源:
@valuesource(类型={参数1,参数2,…}) (类型:ints,string,floats ,… 使用原生类型)
valuesource中支持的类型:
在这里插入图片描述
参数化举列:

strings

public class parameterizdtest {
    @parameterizedtest // 不需要添加 @test 注解,否则方法会多执行一遍
    @valuesource(strings = {"昕上","萌萌","旺财","咪咪"})
    void mytest(string name){
        system.out.println(name);
    }
}

在这里插入图片描述

ints

  @parameterizedtest
    @valuesource(ints = {10,20,30,40})
    void printage(int age){
        system.out.println(age);
    }

在这里插入图片描述

6. 参数化多参数

@csvsource

用到的核心注解: @csvsource(value={“心上,20”,“萌萌,10”,“旺财,70”,“咪咪,99”})
默认的分隔符是逗号“,”

 @parameterizedtest
    @csvsource(value = {"心上,20","萌萌,10","旺财,70","咪咪,99"})
    void printnameandage(string name,int age){
        system.out.println("name:"+name+","+"age:"+age);
    }

如果觉得逗号不好看,也可以自定义分隔符,通过 delimiterstring = “xx” 进行设置:

  @parameterizedtest
    @csvsource(value = {"心上-20","萌萌-10","旺财-70","咪咪-99"},delimiterstring = "-")
    void printnameandage(string name,int age){
        system.out.println("name:"+name+","+"age:"+age);
    }

在这里插入图片描述
如果遇到赋值的值包含了分隔符的特殊情况,需要使用单引号 ‘’ 来进行转义,否则会报错:
在这里插入图片描述
加上单引号:

 @parameterizedtest
    @csvsource(value = {"'心,上',20","萌萌,10","旺财,70","咪咪,99"})
    void printnameandage(string name,int age){
        system.out.println("name:"+name+","+"age:"+age);
    }

在这里插入图片描述
正确赋值,执行通过

@csvfilesource

如果参数非常的多,在代码中编写不太好看,就可以借助文件注入的方法来添加;
@csvfilesource(指定文件路径)

    @parameterizedtest
    @csvfilesource(resources = "/my.csv")
    void csvfilesource(string name,int age){
        system.out.println("name:"+name+","+"age:"+age);
    }

指定文件路径为当前项目下resources文件夹中的.csv文件:
在这里插入图片描述
读取成功,成功赋值:
在这里插入图片描述
也可以读取本地目录下的任意csv文件:
在这里插入图片描述

  @parameterizedtest
    @csvfilesource(files = "d:\\code\\file.csv")
    void csvfilesource2(string name,int age){
        system.out.println("name:"+name+","+"age:"+age);
    }

读取成功:
在这里插入图片描述
在这里插入图片描述
同时也可以赋null值,也就是对应的位置不填写值即可:

   @parameterizedtest
    @csvsource(value = {",20","萌萌,10","旺财,70","咪咪,99"})
    void printnameandage(string name,int age){
        system.out.println("name:"+name+","+"age:"+age);
    }

在这里插入图片描述
数字类型的参数必须有值,否则导致用例执行失败

7. 动态参数

动态参数单参数

核心注解:@methodsource(“”)
参数为数据来源的方法名

   // 动态参数
    @parameterizedtest // 参数化注解
    @methodsource("getname") // 提供参数数据的方法,双引号内填写具体方法名
    void dongtaiparamet(string name){
        system.out.println(name);
    }
    // 提供数据的方法,返回值可以是stream流
    static stream<string> getname(){
        return stream.of("心上","萌萌","旺财");
    }

需要注意提供参数数据的方法返回值可以是 stream流,stream流里面设置填写返回值:
在这里插入图片描述
● 同时需要设置返回数据的方法是静态方法,static
获取成功:
在这里插入图片描述
同样,也可以不进行具体获取参数值方法名称设置,只需要获取参数值的方法名称和测试方法名称保持一致即可识别:
在这里插入图片描述
获取成功:
在这里插入图片描述

动态参数多参数

返回多参数使用 arguments.arguments(参数1,参数2) …

  @parameterizedtest
    @methodsource
    void dongtaiparamstest(string name,int age){
        system.out.println("name:"+name+","+"age:"+age);
    }
    // 返回多参数使用 arguments.arguments(参数1,参数2) ...
    static stream<arguments> dongtaiparamstest() {
        return stream.of(arguments.arguments("心上",10),arguments.arguments("萌萌",20));
    }

参数获取成功
在这里插入图片描述

  • junit5 over ~
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com