为什么需要单元测试
纵观优秀的开源工程,完备的单元测试总是必须的条件。通过这些单元测试,我们可以充分了解代码中相关类和方法的作用和核心逻辑,熟悉各种场景的运行情况。同时也因为有了单元测试,开源作者在接受各种feature的代码提交时才有稳定安全的保障。其实单元测试的重要性所有开发同学应该都了然于胸,同样TDD(测试驱动开发)也不是一个新的概念,但是真当我们落地实践时,又总会找出各种各样的理由来劝服自己下次一定好好写单元测试,这一次先放过自己。这些理由无外乎,开发周期太紧了; 测试同学能保证功能正确性;写单元测试代码量比业务代码还大; 又不是不能跑。所以虽然我们总是在追逐工程师文化,却又时不时放纵在放弃工程师底蕴的路上。
怎么写单元测试
摘自阿里巴巴开发规约
public class Test { // 0. 依赖类 DependencyClass dependencyClass; // 0. 待测试类 TestClass testClass;
public void setUp() { MockitoAnnotations.initMocks(this); }
public void testMethod() { // 1. Mock, 依赖方法,构造中间层数据 when(dependencyClass.someMehod(any())).thenReturn(mockData()); // 2. Do, 调用被测试类 Result result = testClass.testMehod(); // 3. Verify, 校验结果数据 Assert.assertEquals("some expected result string", result.getModel()); }}
public class DefaultMemberManager implements MemberManager { private MemberDAO memberDAO; private CacheManager cacheManager;
public Date queryActivationTime(long userId) { Date activationTime = cacheManager.getActivationTime(userId); if (activationTime == null) { MemberDO memberDO = memberDAO.queryByUserId(userId); if (memberDO != null) { cacheManager.saveActivationTime(userId, memberDO.getActiveTime()); activationTime = memberDO.getActiveTime(); } } return activationTime; }}
public class DefaultMemberManagerTest { MemberDAO memberDAO; CacheManager cacheManager; DefaultMemberManager defaultMemberManager;
public void setUp() { MockitoAnnotations.initMocks(this); }
public void testQueryActivationTime() throws Exception { when(memberDAO.queryByUserId(anyLong())).thenReturn(null); when(cacheManager.getActivationTime(anyLong())).thenReturn( new GregorianCalendar(2022, Calendar.MARCH, 5, 23, 2).getTime()); Date result = defaultMemberManager.queryActivationTime(0L); Assert.assertEquals(new GregorianCalendar(2022, Calendar.MARCH, 5, 23, 2).getTime(), result); }}
团队单元测试建设
总结
Serverless Develpoer Meetup 课程
阿里云首场线下 Serverless Developer Meetup 即将亮相,来自阿里云、淘宝、闲鱼、百富旅行的技术大咖,洞察 Serverless 在中国的发展趋势;深度分享 Serverless 在 双11 和企业的落地经验;首次披露 Serverless Devs 开源细节。
点击阅读原文查看详情!