【软件测试】Junit5

  • Selenium自动化测试框架
  • Junit单元测试框架
  • 拿着一个技术写自动化测试用例 (Selenium3)
  • 拿着一个技术管理已经编写好的测试用例 (Junit5)

Junit相关技术

Junit是针对java的一个单元测试框架。

注解

@Test

表示当前的这个方法是一个测试用例

添加依赖:

【软件测试】Junit5_第1张图片

不需要main方法就能执行,点击类上的运行就是运行所有方法。点击单个方法,就是运行单个方法。

单个方法有错误就会报错。

public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }

    @Test
    void test3(){
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top11-left > a:nth-child(6)"));
    }
}

@Disabled

忽略测试用例。

public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }

    @Disabled
    void test3(){
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top11-left > a:nth-child(6)"));
    }
}

@BeforeAll @AfterAll BeforeEach AfterEach

  • BeforeAll 在所有的测试用例运行之前跑对应的方法
  • AfterAIl 在所有的测试用例运行之后跑对应的方法
  • BeforeEach在每一个测试用例执行之前跑对应的方法
  • AfterEach在每一个测试用例执行之前跑对应的方法
public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }
	// 在所有测试用例运行之前进行运行,相当于运行class的时候进行运行的,属于类方法。
    @BeforeAll
    static void SetUp(){
        System.out.println("这是我们BeforeAll里面的语句");
    }

    @AfterAll
    static void TearDown(){
        System.out.println("这是我们AfterAll里面的语句");
    }
}

输出结果

这是我们BeforeAll里面的语句
这是JunitTest里面的test01
这是JunitTest里面的test02
这是我们AfterAll里面的语句

  • 如果做UI自动化,通常情况下,创建驱动,打开网页,放到BeforeAII里面
  • 关闭浏览器放到AfterAll
public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }

    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }
}

执行结果:

这是BeforeEach里面的语句
这是JunitTest里面的test01
这是AfterEach里面的语句
这是BeforeEach里面的语句
这是JunitTest里面的test02
这是AfterEach里面的语句

  • 如果有5个测试用例,BeforeEach跑几次,BeforeAIl跑几次? 5次,1次
  • 如果有5个测试用例,AfterEach跑几次,AfterAIl跑几次? 5次,1次

参数化

@Test注解不能用在参数化中,参数化必须使用Parameter注解,使用Parameter注解之前必须引入依赖

添加Parameter依赖:

【软件测试】Junit5_第2张图片

@ParameterizedTest和@Test不能一起用。

单参数

public class JunitTest {
    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }

    @ParameterizedTest
    @ValueSource(ints = {1,2,3})//类型的限制~
    void test4(int num){
        System.out.println(num);
    }
    
    @ParameterizedTest
    @ValueSource(strings = {"1","2","3"})
    void test5(String  num){
        System.out.println(num);
    }
}

CSV获取参数

传递一行数据,其中用,分割:

public class JunitTest {
    @ParameterizedTest
    @CsvSource({"1,2,3"})
    void test5(String x,String y,String z){
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
    }
}

传递空字符串:

public class JunitTest {
    @ParameterizedTest
    @CsvSource({"1,2,3,''"})
    void test5(String x,String y,String z,String q){
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(q +"csv");
    }
}

从CSV文件中获取参数:

在resources目录下进行创还能CSV文件。

【软件测试】Junit5_第3张图片

在csv中写入:

张三,李四,王五
张三2,李四2,王五2
张三3,李四3,王五3

必须是csv文件。文件内部必须以,进行分割。

public class JunitTest {
    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }

    @ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
     void test5(String name){
        System.out.println(name);
    }
}

执行几次取决于csv中有几行。

在CSV文件中写入:

1,张三
2,李四
3,王五

public class JunitTest {
    @ParameterizedTest
    @CsvFileSource(resources = "test2.csv")
    void test5(String id,String name){
        System.out.println("学号: " + id +",姓名: " + name);
    }
}

方法获取参数

public class JunitTest {
    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }

    public static Stream<Arguments> Generator(){
        return Stream.of(Arguments.arguments(1,"张三"),
                Arguments.arguments(2,"李四"),
                Arguments.arguments(3,"王五"));
    }
    @ParameterizedTest
    @MethodSource("Generator")
     void test6(int num ,String name){
        System.out.println(num + " : "+ name);
    }
}

测试方法的执行顺序

public class JunitTest {
    @Test
    void Test1(){
        System.out.println("这是Test1测试用例");
    }
    @Test
    void Test2(){
        System.out.println("这是Test2测试用例");
    }
    @Test
    void A(){
        System.out.println("这是TestA测试用例");
    }
    @Test
    void B(){
        System.out.println("这是TestB测试用例");
    }
}

上面的代码调整位置,无法控制执行顺序。执行顺序是默认的,固定不变动的。

TestMethodOrder指定执行顺序

通过TestMethodOrder注解控制执行顺序:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test1(){
        System.out.println("这是Test1测试用例");
    }
    @Order(2)
    @Test
    void Test2(){
        System.out.println("这是Test2测试用例");
    }
    @Order(3)
    @Test
    void A(){
        System.out.println("这是TestA测试用例");
    }
    @Order(4)
    @Test
    void B(){
        System.out.println("这是TestB测试用例");
    }
}

TestMethodOrder随机顺序

随机运行方式:

@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test1(){
        System.out.println("这是Test1测试用例");
    }
    @Order(2)
    @Test
    void Test2(){
        System.out.println("这是Test2测试用例");
    }
    @Order(3)
    @Test
    void A(){
        System.out.println("这是TestA测试用例");
    }
    @Order(4)
    @Test
    void B(){
        System.out.println("这是TestB测试用例");
    }
}

每次的执行顺序不同。

断言

断言相等

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1,2,3})
    void test5(int  num){
        System.out.println(num);
        Assertions.assertEquals(1,num);//断言相等
    }
}

断言不相等

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1,2,3})
    void test5(int  num){
        System.out.println(num);
        Assertions.assertNotEquals(2,num);//断言不相等
    }
}

断言为null

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void test1(int  num){
        System.out.println(num);
        String str = null;
        Assertions.assertNull(str);
    }
    @ParameterizedTest
    @ValueSource(ints = {2})
    void test2(int  num){
        System.out.println(num);
        String str = "null";
        Assertions.assertNull(str);
    }
}

断言不为null

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void test1(int  num){
        System.out.println(num);
        String str = null;
        Assertions.assertNotNull(str);
    }
    @ParameterizedTest
    @ValueSource(ints = {2})
    void test2(int  num){
        System.out.println(num);
        String str = "null";
        Assertions.assertNotNull(str);
    }
}

测试套件

测试套件需要引入的依赖们:


<dependency>
    <groupId>org.junit.jupitergroupId>
    <artifactId>junit-jupiter-apiartifactId>
    <version>5.9.1version>
    <scope>testscope>
dependency>


<dependency>
    <groupId>org.junit.jupitergroupId>
    <artifactId>junit-jupiter-paramsartifactId>
    <version>5.9.1version>
dependency>


<dependency>
    <groupId>org.junit.platformgroupId>
    <artifactId>junit-platform-suiteartifactId>
    <version>1.9.1version>
dependency>

<dependency>
    <groupId>org.junit.jupitergroupId>
    <artifactId>junit-jupiter-engineartifactId>
    <version>5.9.1version>
    <scope>testscope>
dependency>

执行类中的代码

java代码的编写:

@Suite
//依次执行JunitTest和JunitTest1和JunitTest2
@SelectClasses({JunitTest.class, JunitTest1.class,JunitTest2.class})
public class RunSuit {

}

执行包中的代码

创建两个包,包中写上自动化的方法

package Package1;
import org.junit.jupiter.api.Test;

public class TestDemo1 {
    @Test
    void test1(){
        System.out.println("Package TestDemo1 test1");
    }
}
package Package2;
import org.junit.jupiter.api.Test;

public class TestDemo2 {
    @Test
    void test2(){
        System.out.println("Package TestDemo2 test2");
    }
}

使用SelectPackages注解来执行包中的代码:

@Suite
@SelectPackages(value = {"Package1","Package2"})
public class RunSuit {

}

你可能感兴趣的:(软件测试,junit)