关于单元测试,个人认为,在开发一款软件时,测试是必不可少的一项,如果没有比较完善的测试,上线的项目往往会出现很多在开发阶段意想不到的问题。如果这样的一个项目上线之后,让你去负责这么一个不确定的东西,谁都不敢想象,所以说这一部分还是很有必要学习一下的。
1.什么是单元测试?
- 单元:代码的基本组成单位,比如方法、类、模块等。
- 测试:给定输入,检查输出是否符合要求。
- 自动化测试:无需人工干预,定期、不定期自动执行的测试任务。
2.关于java的单元测试框架
- JUnit:最早的单元测试框架
- TestNG:优化了的单元测试框架
- Selenium:侧重于页面和集成测试
- Arquillian:侧重于集成测试,整合CDI。
以下是关于在Netbeans下进行的测试类的创建方式
- 新建测试类:新建->测试类,选择要测试的类
- 要在测试的类上右键点击“工具->新建更新测试”
- 运行时,按照正常的java文件一样运行测试类即可
Ps:
1)在定义测试类的名称问题上,注意最好是用test+类名,否则可能会引起错误(Test class not found in selected Project)当然之后因为有@test注解可以避免,但最好将其作为一种习惯。
2)对于生成的测试类进行运用修改时,需要将最后一行的fail...注释掉,不然在进行测试的时候事没有颁发通过的。
3)在手写测试类的时候,按照对应的情况在上面进行相应的注释
eg: //case1 //case2等等
3JUnit主要的注解
这里所说的对应的注解及为在netbeans里面创建对应的测试类的时候的一些勾选项目,如下所示:
对应会生成相应的测试方法,以下是各种注解的用法:
- @Test:表明方法为测试方法(可以测试期望异常和超时时间)
- @Before:每次执行测试方法前都要执行(初始化方法)
- @After:每次执行测试方法之后都要执行(释放资源)
- @BeforeClass:每次初始化测试类前都要执行(必须为static void)
- @AfterClass:每次初始化测试类后都要执行(必须为static void)
- @Ignore:忽略这个测试方法
- @RunWith:制定测试类使用某个运行器
- @Parameters:制定测试类的测试数据集合
- @Rule:允许灵活添加或重新定义测试类中的每个测试方法的行为
- @FixMethodOrder:制定测试方法的执行顺序
一个测试类单元测试的执行顺序为:
@BeforeClass - > @Before - > @Test - > @After - > @ AfterClass
每一个测试方法的调用顺序为:
@Before - > @Test - > @After
引入对应的一个概念:代码覆盖率
通常的计量方法:已测试的方法/总方法数
JUnit常见断言
assertArrayEquals(expecteds, actuals) | 查看两个数组是否相等。 |
assertEquals(expected, actual) | 查看两个对象是否相等。类似于字符串比较使用的equals()方法 |
assertNotEquals(first, second) | 查看两个对象是否不相等。 |
assertNull(object) | 查看对象是否为空。 |
assertNotNull(object) | 查看对象是否不为空。 |
assertSame(expected, actual) | 查看两个对象的引用是否相等。类似于使用“==”比较两个对象 |
assertNotSame(unexpected, actual) | 查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象 |
assertTrue(condition) | 查看运行结果是否为true。 |
assertFalse(condition) | 查看运行结果是否为false。 |
assertThat(actual, matcher) | 查看实际值是否满足指定的条件 |
fail() | 让测试失败 |
JUnit测试套件
- 将多个测试类组织到一起的方法按照顺序执行。
- 在和Maven整合之后,这一部分就不太重要。
JUnit和Maven的整合
参见Phabricator/training实例
链接:Training实例
JUnit和Jenkins的结合
在登陆Jenkins之后,对应的面板上有关与对应项目的参数信息,而这些对应的信息来源就是在用maven来生成的target>surefire-reports目录下的.xml文件来传递的信息。对应的pom文件配置为:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <skip>true</skip> </configuration> <executions> <!-- 单元测试 --> <execution> <id>unit test</id> <phase>test</phase> <goals> <goal>test</goal> </goals> <configuration> <includes> <include>**/*Test.class</include> </includes> <excludes> <exclude>**/*IT.class</exclude> </excludes> <skip>false</skip> </configuration> </execution> <!-- 集成测试 --> <execution> <id>run-integration-test</id> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> <configuration> <includes> <include>**/*IT.class</include> </includes> <excludes> <include>**/*Test.class</include> </excludes> <skip>false</skip> </configuration> </execution> </executions> </plugin>