单元测试都不做,怪不得你没有女朋友

简介: 单元测试都不做,怪不得你没有女朋友

最近有个大学同学,在追一个女孩子,我一单身狗不懂,也没有办法给他意见,所以我请教了一个有女朋友的同事,他给我讲了一些东西,如下图:
640.png

其实我感觉,写代码和交女朋友一样,我们总想让女孩子尽快答应做我女朋友,正如我们总想快速完成一个项目,我们很少注意一些细节,到头来搞不好项目崩盘(追不上那女孩),好一点就是从头再去一一检查(从头开始追),所以我们要想追女孩子一样去写代码,每次做了一件事都去推导她的意思,开心还是,正如我们单元测试一样是否这个功能是正确。**阿里巴巴Java开发手册【****强制****】****1.**【强制】好的单元测试必须遵守 AIR 原则。说明:单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障上,却是非常关 键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。
  • A:Automatic(自动化)
  • I:Independent(独立性)
  • R:Repeatable(可重复)

2.【强制】单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用 System.out 来进行人肉验证,必须使用 assert 来验证。

3.【强制】保持单元测试的独立性。为了保证单元测试稳定可靠且便于维护,单元测试用例之
间决不能互相调用,也不能依赖执行的先后次序。

反例:method2 需要依赖 method1 的执行,将执行结果作为 method2 的输入。

4.【强制】单元测试是可以重复执行的,不能受到外界环境的影响。

说明:单元测试通常会被放到持续集成中,每次有代码 check in 时单元测试都会被执行。如果单测对外部
环境(网络、服务、中间件等)有依赖,容易导致持续集成机制的不可用。

正例:为了不受外界环境影响,要求设计代码时就把 SUT 的依赖改成注入,在测试时用 spring 这样的 DI 框架注入一个本地(内存)实现或者 Mock 实现。

5.【强制】对于单元测试,要保证测试粒度足够小,有助于精确定位问题。单测粒度至多是类
级别,一般是方法级别。

说明:只有测试粒度小才能在出错时尽快定位到出错位置。单测不负责检查跨类或者跨系统的交互逻辑,
那是集成测试的领域。

6.【强制】核心业务、核心应用、核心模块的增量代码确保单元测试通过。

说明:新增代码及时补充单元测试,如果新增代码影响了原有单元测试,请及时修正。

7.【强制】单元测试代码必须写在如下工程目录:src/test/java,不允许写在业务代码目录下。

说明:源码编译时会跳过此目录,而单元测试框架默认是扫描此目录。

断言:

常用的断言方法如下:
assertEquals(a, b)    测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

assertFalse(a)        测试a是否为false(假),a是一个Boolean数值。

assertTrue(a)         测试a是否为true(真),a是一个Boolean数值

assertNotNull(a)      测试a是否非空,a是一个对象或者null。

assertNull(a)         测试a是否为null,a是一个对象或者null。

assertNotSame(a, b)   测试a和b是否没有都引用同一个对象。

assertSame(a, b)      测试a和b是否都引用同一个对象。

fail(string)          Fail让测试失败,并给出指定信息。

assertThat(expected, Matcher)  通过Matcher断言

Hamcrest :greaterThan,greaterThanOrEqualTo,lessThan,anything,anyOf,containsString

使用@Before和@After

  • 在@Before方法中初始化测试资源
  • 在@After方法中释放测试资源
  • @BeforeClass: 初始化非常耗时的资源, 例如创建数据库
  • @AfterClass: 清理@BeforeClass创建的资源, 例如创建数据库

Test代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class DeviceServiceTests {


    @Autowired
    private DeviceMapper deviceMapper;

    @Before
    public void before(){
        System.out.println("Before测试之前");
    }

    @BeforeClass
    public static void beforeClass(){
        System.out.println("BeforeClass测试之前");
    }

    @After
    public void after(){
        System.out.println("After测试之前");
    }

    @AfterClass
    public static void afterClass(){
        System.out.println("AfterClass测试之后");
    }

    @Test
    public void contextLoads() {
        assertEquals(100,50 + 50);
    }

}

运行结果
640.png

运行结果是成功的。

总结

你的代码正如你在追的女朋友,你不重视单元测试,就如你不重视每次约会,你怎么可能交付项目(交到女朋友)。

相关文章
|
2月前
|
测试技术
|
6天前
|
测试技术 C# 容器
在C#中进行单元测试 _
前言 时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的。 我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写CRUD就是写CRUD,几乎用不到单元测试。写完一个功能直接上手去测,当然这只是我个人感受,仅供参考。 然后当我还在抱怨测试好烦的时候,大佬跟我说为什么不用单元测试和集成测试,我这也是有苦说不出。要知道光学会理论知识,没有实践作为基础,都是扯淡,入职这么久还真没用过单元测试,吓得我赶紧去找资料学习。 那么也是通过观看B站某位Up主的视频,然后有点想法写下这篇文章,虽然up主的主题是探究接口的作用和意义,但是
|
2月前
|
测试技术 iOS开发
单元测试,XCTestCase的使用与限制
单元测试,XCTestCase的使用与限制
29 2
|
2月前
|
敏捷开发 Java 测试技术
为什么要单元测试(正片)
在如今的互联⽹时代,软件迭代的速度越来越快,研发的职责也越来越多。DevOps的理念是"you build it, you run it",研发/测试合⼆为⼀的趋势也可以理解为对"you build it, you test it"的呼吁。当研发要对⾃⼰写的代码质量和测试负责的时候,好的测试实践就必不可少了。
|
2月前
|
测试技术
为什么要单元测试
刹⻋是降低了⻋速还是提升了⻋速?我们通常认为写单测费⼒耗时、耽误研发进度,仿佛在给项⽬“踩刹⻋”。⼤家不妨带着这个问题往下看,详细聊聊为什么单元测试可以让软件开发跑得更快。
|
测试技术 编译器 Linux
浅谈c++单元测试
浅谈c++单元测试
|
Java 测试技术 容器
还在手动写单元测试?
还在手动写单元测试?
91 0
|
敏捷开发 测试技术 程序员
|
测试技术 C++ 编译器
|
SQL 测试技术 数据库
什么是单元测试?为什么要做?
什么是UT? UT(Unit Test)即单元测试
290 0
什么是单元测试?为什么要做?