Junit入门到掌握-10-JUnit高级-Categories

2024-06-11 10:48

本文主要是介绍Junit入门到掌握-10-JUnit高级-Categories,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面介绍了测试套件TestSuite的概念和基本功能是把需要测试的测试类加进来管理,像一个容器一样。这样管理方式有些简单粗暴,为了达到更精细和灵活管理,我们这篇来学习一个Categories的概念,字面意思就分类。

 

1.Categories

这个分类和测试套件很像。

第一个特点,在TestSuite原来的注解变了,第二个我们需要在原来的TestClass里面是有Catogories注解。category既可以作用在方法,也可以作用在类上,我们习惯写在class 名称前一行,写在方法前一行不常用,一般一个class,我们做一个类型测试,一个业务场景类型。

 

2.Category demo练习

我们有两个测试类,我们把HelloJunitTest.java分类成A.class, 把PreteinTrackingTest.java分类成A.class, 只把前面文章写过的Timeout这个用例注释为B.class, A.class表示成功的用例集合,B.class表示失败的,A B都是接口。

 

搜先,我们需要提前创建一个Catogory的一个接口,用来后面分类使用,这个就是A.class

 

注意,这是一个接口,目前我们这个接口什么代码都不写。

package test;public interface GoodCategoryTest {}

然后创建一个BadCatoryTest接口

package test;public interface BadCategoryTest {}

然后开始使用Category注解在测试类中标注

package test;import static org.junit.Assert.assertEquals;import org.junit.Test;
import org.junit.experimental.categories.Category;@Category(GoodCategoryTest.class)
public class HelloJunitTest {@Testpublic void test() {assertEquals(5, "Hello".length());}
}

来看第二个测试类,由于我需要把里面一个方法标注成B.class,所以只能每个方法上都添加Category注解。

package test;
import static org.junit.Assert.*;import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;import com.anthony.protein.InvalidGoalException;
import com.anthony.protein.TrackingService;public class TrackingServiceTests {private TrackingService ts;@BeforeClasspublic static void before() {System.out.println("Before class, Onln Once");}@AfterClasspublic static void after() {System.out.println("After class, only once");}@Beforepublic void setup() {System.out.println("Before Method");ts = new TrackingService();}@Afterpublic void tearDown() {System.out.println("After Method");}@Test@Category(GoodCategoryTest.class)public void newTrackingServiceTotalIsZero() {assertEquals("Tracking service total was not zero", 0, ts.getTotal());}@Test@Category(GoodCategoryTest.class)public void whenAddingProteinTotalIsIncreaseByAmount() {ts.addProtein(10);assertEquals(10, ts.getTotal());}@Test@Category(GoodCategoryTest.class)public void whenRemovingProteinTotalRemainsZero() {ts.removeProtein(5);assertEquals(0, ts.getTotal());}@Test(expected=InvalidGoalException.class)@Category(GoodCategoryTest.class)public void testExceptionThrow() throws InvalidGoalException {ts.setGoal(-5);}@Test(timeout=20)@Category(BadCategoryTest.class)public void badTest() throws InvalidGoalException {for(int i=0; i < 1000000000; i++) {ts.setGoal(1);}
}}

 

这个时候TestSuite这样写

package test;import org.junit.experimental.categories.Categories;
import org.junit.experimental.categories.Categories.IncludeCategory;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;@RunWith(Categories.class)
@IncludeCategory(GoodCategoryTest.class)
@Suite.SuiteClasses({ HelloJunitTest.class, TrackingServiceTests.class // 接着写其他被测单元测试类
})public class ProteinTrackerSuite {}

执行下这个TestSuite文件

这种场景,我们还可以利用取反策略来跑用例,这里我们的场景是只执行Good的测试用例,取反就是除Bad之外的,我们需要利用注解@IncludeCategory相反的作用的,叫做@ExcludeCategory,就是除...之外,测试套件注解这么写,也是可以达到上面一样的运行结果。

package test;import org.junit.experimental.categories.Categories;
import org.junit.experimental.categories.Categories.ExcludeCategory;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;@RunWith(Categories.class)
@ExcludeCategory(BadCategoryTest.class)
@Suite.SuiteClasses({ HelloJunitTest.class, TrackingServiceTests.class // 接着写其他被测单元测试类
})public class ProteinTrackerSuite {}

 

也就是只执行类GoodCategoryTest这个分类的用例,我把测试套件改成只执行BadCategoryTest.class

package test;import org.junit.experimental.categories.Categories;
import org.junit.experimental.categories.Categories.IncludeCategory;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;@RunWith(Categories.class)
@IncludeCategory(BadCategoryTest.class)
@Suite.SuiteClasses({ HelloJunitTest.class, TrackingServiceTests.class // 接着写其他被测单元测试类
})public class ProteinTrackerSuite {}

运行下

只执行这个标注为BadCategoryTest.class的用例,这个是期待的效果。

 

这篇关于Junit入门到掌握-10-JUnit高级-Categories的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050957

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2