目录
1.Junit是什么?
2.常用注解
@Test
@Disabled
@BeforeAll@AfterAll
@BeforeEach@AfterEach
3.参数化
单参数
CSV获取参数
方法获取参数
用例执行顺序问题
4.断言
5.测试套件
指定类执行
指定包执行
selenium是自动化测试框架,Junit是单元测试框架
使用技术写自动化测试用例(selenium3)
使用技术管理已经编写好的测试用例(Junit5)
1.Junit是什么?
Junit 是一个用于 Java 编程语言的开源单元测试框架,被广泛应用于软件开发中进行单元测试。
使用Junit需要导入的依赖
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
2.常用注解
@Test
表示当前方法是一个测试用例
public class Test11 {
@Test
public void test1(){
System.out.println("junit中的test1");
}
}
点击class左侧的run,会执行所有的测试,每个方法的左边的run只执行当前方法
@Disabled
忽略带有该注解的测试方法
public class Test11 {
@Test
public void test1(){
System.out.println("junit中的test1");
}
@Test
public void test2(){
System.out.println("junit中的test2");
}
@Disabled
public void test3(){
System.out.println("junit中的test3");
}
}
执行class的run,结果没有出现test3,被忽略了
@BeforeAll@AfterAll
- @BeforeAll 标记的方法在所有测试方法执行之前运行,通常用于在所有测试开始之前进行一次性的准备工作。例如,可以在 @BeforeAll 方法中初始化共享资源、创建数据库连接等操作。
- @AfterAll 标记的方法在所有测试方法执行结束后运行,通常用于进行一次性的清理和资源释放工作。例如,可以在 @AfterAll 方法中关闭数据库连接、清理临时文件等操作。
- 这些方法必须是静态方法,并且不能接受任何参数,因为它们在测试类实例化之前就会被执行。
public class Test11 {
@Test
public void test1(){
System.out.println("junit中的test1");
}
@Test
public void test2(){
System.out.println("junit中的test2");
}
@Disabled
public void test3(){
System.out.println("junit中的test3");
}
@BeforeAll
static void SetUpTest(){
System.out.println("junit中的BeforeAll");
}
@AfterAll
static void TearDown(){
System.out.println("junit中的AfterAll");
}
@BeforeEach@AfterEach
- @BeforeEach 标记的方法在每个测试方法执行之前运行,通常用于在每个测试开始之前进行一些准备工作。例如,可以在 @BeforeEach 方法中初始化测试数据、创建对象实例等操作。
- @AfterEach 标记的方法在每个测试方法执行结束后运行,通常用于进行清理工作并还原测试环境。例如,可以在 @AfterEach 方法中清理测试数据、释放资源等操作。
- 这些方法必须是非静态方法,并且不能接受任何参数,因为它们在每个测试方法执行前后都会被执行。
public class Test11 {
@Test
public void test1(){
System.out.println("junit中的test1");
}
@Test
public void test2(){
System.out.println("junit中的test2");
}
@Disabled
public void test3(){
System.out.println("junit中的test3");
}
// @BeforeAll
// static void SetUpTest(){
// System.out.println("junit中的BeforeAll");
// }
// @AfterAll
// static void TearDown(){
// System.out.println("junit中的AfterAll");
// }
@BeforeEach
void BeforeEachTest(){
System.out.println("BeforeEachTest");
}
@AfterEach
void AfterEachEachTest(){
System.out.println("AfterEachTest");
}
}
3.参数化
当加入两个参数后运行会报错
No ParameterResolver registered for parameter [int arg0] in method [public void Test11.test1(int,int)].
引入参数化依赖
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
单参数
int型
@ParameterizedTest
@ValueSource(ints = {1,2,3})
void test4(int num){
System.out.println(num);
}
单参数:string型
@ParameterizedTest
@ValueSource(strings = {"1","2","3"})
void test5(int num){
System.out.println(num);
}
CSV获取参数
CSV是什么?
CSV(Comma-Separated Values)是一种常见的文件格式,用于存储和传输表格数据。
格式:逗号作为字段之间的分隔符,每行表示一个记录,每个字段表示记录中的一个属性。必须以.csv后缀结尾
CSV 文件是以纯文本形式存储,可以使用任何文本编辑器打开和编辑。每行记录中的字段可以使用引号包围,以处理包含逗号或换行符的特殊情况。通常,第一行会用于存储列名,而后续行则包含实际的数据。
使用 CSV 文件可以更好地组织和管理大量的测试参数。您可以根据需要创建多个 CSV 文件,按照不同的场景、测试用例或测试数据集对参数进行分类并存储在独立的文件中。这样可以提高参数的可维护性和复用性。
@ParameterizedTest
@CsvFileSource(resources = "test1.csv")
void test6(String num,String age,String work){
System.out.println(num+" "+age+" "+ work);
}
只能获取同一类型的参数
方法获取参数
@ParameterizedTest
@MethodSource("Generator")
void test7(int num,String name){
System.out.println(name+":"+num);
}
public static Stream<Arguments> Generator() {
return Stream.of(Arguments.arguments(1,"张三"),Arguments.arguments(2,"张三2"),Arguments.arguments(3,"张三3"));
}
获取不同类型的参数,注意不能搭配@Test使用,会只执行Test,报错
用例执行顺序问题
public class Test2 {
@Test
void method3(){
System.out.println("method3");
}
@Test
void method1(){
System.out.println("method1");
}
@Test
void method2(){
System.out.println("method2");
}
}
与代码顺序无关,可通过注解设置选后执行顺序:@Order,或者设置随机执行
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Test2 {
@Order(1)
@Test
void method3(){
System.out.println("method3");
}
@Order(2)
@Test
void method1(){
System.out.println("method1");
}
@Order(3)
@Test
void method2(){
System.out.println("method2");
}
}
4.断言
断言相等
@ParameterizedTest
@ValueSource(ints = {2})
void test4(int num){
System.out.println(num);
Assertions.assertEquals(1,num);
}
断言不相等
@ParameterizedTest
@ValueSource(ints = {2})
void test4(int num){
System.out.println(num);
Assertions.assertNotEquals(2,num);
}
断言为空
@ParameterizedTest
@ValueSource(ints = {2})
void test4(int num){
System.out.println(num);
// Assertions.assertNotEquals(2,num);
String str = "world";
Assertions.assertNull(str);
}
断言不为空
@ParameterizedTest
@ValueSource(ints = {2})
void test4(int num){
System.out.println(num);
// Assertions.assertNotEquals(2,num);
String str = null;
Assertions.assertNotNull(str);
}
5.测试套件
指定类执行
先引入依赖
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
@Suite
@SelectClasses({Test2.class,Test11.class})
public class RunSuite {
}
选择类进行测试用例执行,先执行test2,再执test11
指定包执行
@Suite
@SelectPackages("package1")
public class RunSuite {
}
有多个包,可以使用value数组的形式来执行
格式:
@SelectPackages(value={"package1","package2",......)