测试|Junit相关内容

文章目录

测试|Junit相关内容0.Junit说明1.Junit注解@Test@Disabled@BeforeAll和@AfterAll@BeforeEach和@AfterEach

2.Junit参数化单参数多参数(多种/多组)CSV获取参数(支持多种)CSV文件获取参数(支持多种多组)方法获取参数(支持多种多组)

补充:

3.Junit测试用例执行顺序手动指定执行顺序(OrderAnnotation)随机执行顺序(Random)

4.断言断言相等和断言不相等断言为空和断言不为空

5.Junit测试套件常见问题No tests were found

0.Junit说明

Junit是针对Java进行单元测试的一种框架。

注:这里使用的版本是Junit5,前边写的Selenium是Selenium5

1.Junit注解

@Test

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

测试用例跑过了:

测试用例跑不过:(只跑一个,跑全部的)

@Disabled

表示忽略当前测试用例,跳过当前测试用例

@BeforeAll和@AfterAll

含义:@BeforeAll:所有测试用例跑之前跑的,@AfterAll:所有测试用例跑完后跑的

说明:

这两个注解下的方法需要是静态的一般初始化放在BeforeAll所在方法中,关闭资源放在AfterAll中如果做UI自动化,通常情况下,创建驱动,打开网页,放到BeforeAll中;关闭浏览器放到AfterAll中

@BeforeEach和@AfterEach

@BeforeEach&@AfterEach 和 @BeforeAll和@AfterAll区别:

@BeforeAll是在所有测试用例之前跑一次相应的方法@BeforeEach是在每个测试用例之前跑一次相应的方法@AfterEach 是在每个测试用例之后跑一次相应的方法@AfterAll是在所有测试用例之后跑一次相应的方法

2.Junit参数化

不进行参数注册,就往注解下的方法中传参,会报错,这个时候就需要引入相关依赖,进行参数注册

org.junit.jupiter

junit-jupiter-params

5.9.1

test

注意:这里的scope还是需要注释掉

其中@ParameterizedTest表明当前方法为参数化测试方法

单参数

这里的单不是单个,而是单种,只不过这一种参数下可以有一个参数也可以有多个参数

使用方法:在方法上加上两个注解:@ParameterizedTest,@ValueSource(类型名s={xxxxxx})

传参与入参

@ParameterizedTest

@ValueSource(strings={"1","2","3"})

void test05(String num){

System.out.println(num);

}

多参数(多种/多组)

其实我觉得这里如果是多个参数,对象包装一下会比较方便即对象单参数获取,如果是多个对象就是对象数组。

CSV获取参数(支持多种)

@CsvSource注释的值是一个字符串数组,每个字符串表示一组参数

每个参数对应一列

入参的个数大于形参的情况:

空字符串的传递:

不同类型的一组参数:(主要看第三种情况)

CSV文件获取参数(支持多种多组)

当存在多种参数的时候,使用ValueSource不再方便,使用csv文件更加方便。

1.类型的相同的多组

2.类型不相等的多组

方法获取参数(支持多种多组)

有时参数不能直接生成,我们就需要使用方法获取参数的方式

补充:

虽然不能完全理解,也不知道到底是哪些类实现了这些接口,但是从这些源码大概能知道单参数的时候起码是数组,一定程度上可以帮助理解。

3.Junit测试用例执行顺序

public class JunitTest01 {

@Test

void testB(){

System.out.println("testB的测试用例");

}

@Test

void test01(){

System.out.println("test01的测试用例");

}

@Test

void test02(){

System.out.println("test02的测试用例");

}

@Test

void testA(){

System.out.println("testA的测试用例");

}

}

为什么执行顺序是固定的?

因为Junit有自己执行顺序的算法,如果想要指定执行顺序需要特殊处理

手动指定执行顺序(OrderAnnotation)

@TestMethodOrder(MethodOrderer .OrderAnnotation.class)

public class JunitTest01 {

@Order(1)

@Test

void testB(){

System.out.println("testB的测试用例");

}

@Order(2)

@Test

void test01(){

System.out.println("test01的测试用例");

}

@Order(3)

@Test

void test02(){

System.out.println("test02的测试用例");

}

@Order(4)

@Test

void testA(){

System.out.println("testA的测试用例");

}

}

随机执行顺序(Random)

@TestMethodOrder(MethodOrderer.Random.class)

//@TestMethodOrder(MethodOrderer .OrderAnnotation.class)

public class JunitTest01 {

// @Order(1)

@Test

void testB(){

System.out.println("testB的测试用例");

}

// @Order(2)

@Test

void test01(){

System.out.println("test01的测试用例");

}

// @Order(3)

@Test

void test02(){

System.out.println("test02的测试用例");

}

// @Order(4)

@Test

void testA(){

System.out.println("testA的测试用例");

}

}

4.断言

测试用例需要有校验,需要把执行结果和预期结果进行对比。使用assert关键字。

断言相等和断言不相等

断言相等:

断言不相等:

当断言数组时,可以使用 assertArrayEquals 方法来比较两个数组是否相等。以下是一个示例:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;

public class ArrayAssertionTest {

@Test

public void testArrayEquals() {

int[] expected = {1, 2, 3, 4};

int[] actual = {1, 2, 3, 4};

assertArrayEquals(expected, actual);

}

}

在上述示例中,assertArrayEquals 方法将会比较两个数组 expected 和 actual 是否相等。如果数组内容相同,则断言通过,否则断言失败。

断言为空和断言不为空

期待是不为空和期待是空:

5.Junit测试套件

测试套件的相关操作需要引入相关依赖,注意,因为这里是在main文件夹下而不是在test文件夹下,所以记得把scope这个标签注释掉

org.junit.platform

junit-platform-suite-api

1.9.1

org.junit.jupiter

junit-jupiter-engine

5.9.1

使用方法有两种,一种是通过class,另外一种是通过包。

对应的注解分别是@SelectClasses,@SelectPackage

@Suite

//通过class测试用例运行

@SelectClasses({JunitTest.class,JunitTest01.class})

//通过包

//@SelectPackages(value = {"package01","package02"})

public class RunSuite {

}

public class Test01 {

@Test

public void test01(){

System.out.println("package01-->test01");

}

}

public class Test01 {

@Test

public void test01(){

System.out.println("package02-->test01");

}

}

常见问题

No tests were found

原因1:这是@Test注解方法的权限问题,类中方法默认权限是default,

对于@Test注解的方法,我们可以选择写public,也可以选择不写。

如果写成private,当前方法就不能被识别出是一个测试用例了。

解决办法:改成public,或去掉private

原因2:

同样的标签需要导两次…

org.seleniumhq.selenium

selenium-java

3.141.59

commons-io

commons-io

2.11.0

org.junit.jupiter

junit-jupiter-api

5.9.1

org.junit.jupiter

junit-jupiter-params

5.9.1

org.junit.jupiter

junit-jupiter-params

5.9.1

org.junit.platform

junit-platform-suite

1.9.1

test

org.junit.platform

junit-platform-suite

1.9.1

org.junit.jupiter

junit-jupiter-engine

5.9.1

test

1.9.1

org.junit.jupiter

junit-jupiter-engine

5.9.1

test

原因3:方法不能有返回值

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: