软件测试丨基于 Junit4,利用 xUnit 框架让你的测试用例可维护性大幅提升
xUnit 是一系列测试框架的统称,最开始来源于一个叫做 Smalltalk 的 SUnit 框架。
现在各种面向对象的语言,如 Java、Python 的鼻祖就是 Smalltalk,后来这些语言都借助了 Sunit 框架的理念,有很多通用的规范和特征,也就统称为 xUnit。
xUnit 是什么
xUnit 之框架与体系
很多我们已知的单元测试框架,比如 python 的 UnitTest、PyTest 以及 Java 的 JUnit、TestNG 他们通用体系结构统称为“ xUnit”。
而 xUnit 的 architecture(体系结构)通常都是由以下的结构组成:Test Runner :测试的运行器 Test Case :测试用例 Test Fixtures : 测试夹具/治具,用来管理测试用例的执行 Test Suites :测试套件,用来编排测试用例 Test Execution:测试执行,以何种顺序执行 Test Result Formatter:测试结果,具备相同的格式,可被整合 Assertions:断言
从 Junit4 开启 xUnit 框架之旅
Why Junit4?
在目前的行业中,Junit4 仍然是 99%的研发工程师的首选框架,所以可以方便测试工程师与研发工程师交流(偷偷拉个关系~)。而且 TestNG 的使用多用于测试工程师。
Junit5 还未大规模普及(但是从使用上面来说最推荐的框架,成熟、好用、研发测试通用),而很多框架依然基于 Junit4 定制,所以我们还无法从 Junit4 转换到 Junit5 中。
测试用例之核心元素
一个测试用例到底应该有哪些核心的元素?测试用例的名字:特性方法名测试用例的描述与标签:注解测试用例的容器:类或者套件
测试过程:单元测试 Web 自动化测试 SeleniumApp 自动化测试 Appium 接口自动化测试 RestAssured
测试断言
基本 demo 的运行
1)创建 maven 工程 XUnit,pom.xml 中添加 Junit 依赖

2)src/test/java 下创建测试类 Junit4DemoTest 注:
测试类要以 Test 开头或者结尾 maven auto-importsrc/main/java 存放应用实现代码 src/test/java 存放单元测试单元测试的原则之一:用例可以独立运行
基本测试 demo 运行:

运行结果:

用例间的执行顺序
Junit4 的执行顺序:
Default 取决于反射方法获得的列表,顺序固定(不保险)
@FixMethodOrder(MethodSorters.JVM) 顺序可能变化
@FixMethodOrder(MethodSorters.NAME_ASCENDING) 按照名字 ASCII 顺序(稳定常用,建议使用)
TestNG、Junit5 的执行顺序:
可以通过注解设置顺序 Order
顺序演示:

运行结果:

测试套件的执行顺序支持

Junit4:
@BeforeClass、@AfterClass
@Before、@After
TestNG:
@BeforeClass
@BeforeMethod
BeforeGroup、@BeforeSuite
Junit5:
@BeforeClass
@BeforeEach
实操演示 1:
在用例执行前后增加 @Before 和 @After:

运行结果:

实操演示 2:
再增加 @BeforeClass 和 @AfterClass

运行结果:

App 自动化测试用例管理
基类的 @BeforeClass:
配置读取、配置 Capability、初始化 driver、安装 App,PageObject 初始化
集成的子类执行流程:
@Before:启动并进入特定界面
@Test:测试用例执行
@After:回退到入口
@BeforeClass:进图特定的 tab 子功能页面
@AfterClass:关闭 app
基类的 @AfterClass
driver.quit
继承关系下的测试流程
流程顺序:
父类 @BeforeClass
子类 @BeforeClass
父类 @Before
子类 @Before
子类 @Test
父类 @Test
子类 @After
父类 @After
子类 @AfterClass
父类 @AfterClass
实操演示 1:
现在创建一个子类 Junit4DemoChildrenTest,继承 Junit4DemoTest,然后实现和父类一样的方法并运行子类:

运行结果:

从运行结果中我们可以看到,子类会将与父类中一样的方法进行覆盖,只执行子类中的方法
实操演示 2:
现在将子类中的方法名进行修改,使其与父类方法名不同,再运行子类:

运行结果:

如何使用测试套件
测试套件有如下三种类型
RunWith
SuiteClasses
class
实操演示:
新建一个子类 Junit4DemoChildren2Test,继承 Junit4DemoTest

再建一个测试类 SuitesTest,写上注解 @RunWith(Suite.class),表明这是一个测试套件,是多个测试类的一个集合,一个容器;
然后利用注解 @Suite.SuiteClasses 来设置测试类集合,设置测试类执行的顺序

运行结果:



由测试结果可以看到使用套件后,测试过程为 Junit4DemoChildren2Test、Junit4DemoTest、Junit4DemoChildrenTest 的顺序执行。
版权声明: 本文为 InfoQ 作者【测试人】的原创文章。
原文链接:【http://xie.infoq.cn/article/bbbe4a2f5ab499e16b661ee0c】。文章转载请联系作者。
评论