@After(tearDown)卸载夹具或清理环境:在测试用例的每个测试方法之后执行;比如数据库测试时回滚事务,删除数据;关闭文件;
@BeforeClass:在整个测试用例之前执行;
@AfterClass:在整个测试用例之后执行;
使用如上方法,而不是直接在测试方法中安装/卸载;是因为不管有没有异常,@After/@AfterClass都会执行,这样防止出现异常可能造成环境是不新鲜的问题 。
如果大家使用spring test来测试数据库相关的系统,可以考虑使用@TransactionConfiguration来支持默认事务回滚,这样不会对现有系统造成影响 。具体可参考《【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3》和《【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3》
测试时一定要保证环境是干净/新鲜的,才能保证每次测试的结果是一样的 。
2.3、被测系统与依赖系统
被测系统:在Java中就是被测试的Java类 。
依赖系统:就是被测试Java类依赖的其他类 。
如果是单元测试,一般情况下,会对依赖系统进行模拟(Mock) , 即给它一个假的实现;典型的如测试服务层时注入一个Mock的DAO层,这样的好处:
加快测试速度;因为不会调用真实的被测系统 , 所以速度特别快;
测试还没有完成的功能;尤其在多团队协作时,可以只在定义好接口的情况下开发系统;
如果是集成测试时,直接注入真实的依赖系统即可,好处:
完成联调;
发现自己的问题;
还可能发现自己使用上问题及使用的API的问题;
单元测试虽然好,但是是隔离测试 , 即不会调用被测系统来完成测试,因为不是真实的联调,所以很可能会潜在有一些问题,因此还是需要集成测试 。(所以不是很刻意分单元或集成测试,且有些系统可能只有集成测试)
但是集成测试速度是比较慢的,一般提交给CI执行,不影响当前开发进度 。
2.4、验证
验证的目的:是保证实际结果和我们预期的结果是否一致,说白了就是是否是我们想的那样 。
一般使用断言来验证,如:
Assert.assertEquals(expectedResult, actualResult); //验证预期结果和实际结果是否相等
验证主要有两种:
结果验证
行为验证
结果验证:即验证被测系统返回的结果是否正确,如:
Java代码
@Test
public void testCount() {
String ql = "select count(o) from User o";
long expectedCount = repositoryHelper.count(ql) + 1;
User user = createUser();
repositoryHelper.getEntityManager().persist(user);
long acutalCount = repositoryHelper.count(ql);
Assert.assertEquals(expectedCount, acutalCount);
}
验证返回的数据总数 = 插入之前的总数 + 1; 即结果验证 。此处我们使用了一种叫做相对(delta)测试;即不关心数据库里到底多少条,只关心实际的和预期的差 。
行为验证:即验证被测系统是否调用了依赖系统的某个API,这个只有当我们使用Mock时测试时比较简单 , 如当用户注册时:
1、加积分
2、发系统消息
3、……
此时我们并不能通过结果验证是否调用了这些方法;那么我们可以使用Mock技术来完成验证是否调用了这些API,比如使用jmock测试框架就支持行为验证 。集成测试是很难进行行为验证的,如果测试需要预留间谍接口 。
3、测试有哪些好处?
我们写代码的目的是正确的完成某个功能 , 如何保证正确呢?测试!所以在不使用如单元测试技术时 , 我们也是需要测试 , 但是这个测试是我们人工验证的 。缺点很明显:
推荐阅读
- 安卓系统存号码,安卓手机号码在哪个文件夹
- rsgis的比较,rs和gis的应用
- m20pro升级鸿蒙后发热,升级鸿蒙以后发热
- 华登区块狗注册小程序,华登区块狗的利润从哪里来
- vbnet特点 vbnet能做什么
- knoka电视什么牌子,kk是什么牌子电视
- flutterofbird,flutterofbirds全集
- iso怎么装固态硬盘系统,iso安装到硬盘
- mysql怎么构建er图 归禄格见官