4.@Disabled
@Disabled用于禁用测试类或测试方法,添加该注解的方法不会被测试。
public class JUnitTest {
@BeforeAll
static void beforeAll(){
System.out.println(“我是BeforeAll,我最开始执行。”);
}
@AfterAll
static void afterAll(){
System.out.println(“我是AfterAll,我最后执行。”);
}
@BeforeEach
void beforeEach(){
System.out.println(“我是BeforeEach,我在每个 @Test 前执行。”);
}
@AfterEach
void afterEach(){
System.out.println(“我是AfterEach,我在每个 @Test 后执行。”);
}
@Test
@Disabled //忽略测试用例1
void test0(){
System.out.println(“测试用例1”);
}
@Test
void test1(){
System.out.println(“测试用例2”);
}
@Test
void test2(){
System.out.println(“测试用例3”);
}
}
结果:
(三)参数化测试
1.@ParameterizedTest + @ValueSource
@ParameterizedTest
的作用就是可以用不同的参数多次运行测试。但是必须声调用提供参数的来源(source)。
@ValueSource
它可以让你指定一个原生类型(String,int,long或double)的数组,并且只能为每次调用提供一个参数。
public class JUnitTest {
@BeforeAll
static void beforeAll(){
System.out.println(“我是BeforeAll,我最开始执行。”);
}
@AfterAll
static void afterAll(){
System.out.println(“我是AfterAll,我最后执行。”);
}
@BeforeEach
void beforeEach(){
System.out.println(“我是BeforeEach,我在每个 Test 前执行。”);
}
@AfterEach
void afterEach(){
System.out.println(“我是AfterEach,我在每个 Test 后执行。”);
}
@Test
void test0(){
System.out.println(“测试用例1”);
}
@Test
void test1(){
System.out.println(“测试用例2”);
}
@Test
void test2(){
System.out.println(“测试用例3”);
}
@ParameterizedTest
@ValueSource(strings = {“小明”,“小红”,“小兰”})
void paramTest(String name){
System.out.println(name);
}
}
结果:
2.@ParameterizedTest + @CsvSource
@CsvSource
允许将参数列表表示为以逗号分隔的值(例如,字符串文字)。
public class JUnitTest {
@ParameterizedTest
@CsvSource({“小明, 1”,“小红,2”,“小兰,3”})
void csvSource(String name,int id){
System.out.println(name + “:” + id);
}
}
结果:
@CsvSource
使用'
作为转义字符。
示例输入 | 结果字符列表 |
---|---|
@CsvSource({ “foo, bar” }) | "foo" , "bar" |
@CsvSource({ “foo, ‘baz, qux’” }) | "foo" , "baz, qux" |
@CsvSource({ “foo, ‘’” }) | "foo" , "" |
@CsvSource({ "foo, " }) | "foo" , null |
3.@ParameterizedTest + @CsvFileSource
@CsvFileSource
让你使用classpath中的CSV文件。CSV文件中的每一行都会导致参数化测试的一次调用。
在resources
目录下创建csv
文件:
test.csv:
小明, 1
小红, 2
“小明, 小红”, 3
public class JUnitTest {
@ParameterizedTest
@CsvFileSource(resources = “/test.csv”)
void csvFile(String name,int id){
System.out.println(name + ": " + id);
}
}
结果:
与@CsvSource
中使用的语法相反,@CsvFileSource
使用双引号"
作为转义字符。通过上面的代码就可以看出来。一个空的转义值""
会产生一个空字符串, 一个完全为空的值被解释为null引用。
4.@ParameterizedTest + @MethodSource
@MethodSource
允许引用一个或多个测试类的工厂方法。
public class JUnitTest {
@ParameterizedTest
@MethodSource(“stringProvider”) //指定方法
void methodSource(int age,String name){
System.out.println(age + ": " + name);
}
static Stream stringProvider() {
return Stream.of(
Arguments.arguments(12,“李四”),
Arguments.arguments(18,“王五”),
Arguments.arguments(20,“小红”)
);
}
}
@MethodSource
注解表示这个方法的参数来源于一个名为stringProvider
的静态方法。stringProvider
方法返回一个Stream<Arguments>
类型的对象,其中每个Arguments
对象包含了一组用于测试的参数。
(四)测试方法的执行顺序
1.@TestMethodOrder + @Order
在 JUnit5 中,测试方法执行的顺序是不确定的或者是根据方法首字母来排序的。
public class JUnitTest2 {
@Test
void C(){
System.out.println(“A”);
}
@Test
void B(){
System.out.println(“B”);
}
@Test
void A(){
System.out.println(“C”);
}
}
结果:
让执行顺序为 C、B、A:
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnitTest2 {
int a = 0;
@Test
@Order(1)
void C(){
a++;
System.out.println(a);
System.out.println(“C”);
}
@Test
@Order(2)
void B(){
a++;
System.out.println(a);
System.out.println(“B”);
}
@Test
@Order(3)
void A(){
a++;
System.out.println(a);
System.out.println(“A”);
}
}
首先在类上添加@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
,然后再为每个方法上添加@Order()
注解,值越小越优先被执行。
(五)测试实例的生命周期
1.@TestInstance
我添加一个成员变量,每次执行测试方法的时候都++
一次。
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestInstance(TestInstance.Lifecycle.PER_METHOD)
public class JUnitTest2 {
int a = 0;
@Test
@Order(1)
void A(){
a++;
System.out.println(“A方法:” + a);
System.out.println(“A”);
}
@Test
@Order(2)
void B(){
a++;
System.out.println(“B方法:” + a);
System.out.println(“B”);
}
@Test
@Order(3)
void C(){
a++;
System.out.println(“C方法:” + a);
System.out.println(“C”);
}
}
结果:
为了允许隔离执行单个的测试方法,JUnit在执行每个测试方法之前会创建每个测试类的新实例。如果想改变策略,就要用@TestInstance
,在类上添加@TestInstance(TestInstance.Lifecycle.PER_CLASS)
。
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class JUnitTest2 {
int a = 0;
@Test
@Order(1)
void A(){
a++;
System.out.println(“A方法:” + a);
System.out.println(“A”);
}
@Test
@Order(2)
void B(){
a++;
System.out.println(“B方法:” + a);
System.out.println(“B”);
}
@Test
@Order(3)
void C(){
a++;
System.out.println(“C方法:” + a);
System.out.println(“C”);
}
}
结果:
Lifecycle.PER_CLASS
表示只创建一个实例。不添加注解的时候,默认是Lifecycle.PER_METHOD
。
当使用这种模式时,每个测试类将创建一个新的测试实例。因此,如果测试方法依赖于存储在实例变量中的状态,则可能需要在@BeforeEach
或@AfterEach
方法中重置该状态(重置变量的值)。
(六)断言 Assertions
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
存中…(img-TsV3RJe0-1712730035569)]
[外链图片转存中…(img-X77GMl0V-1712730035569)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-bUMLlzdQ-1712730035569)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!