单元测试中的Exploding Fake

1. 什么是exploding fake?

让我们先看以下代码。

int a_stub(){
    fail("Boom!!! I shouldn't have been called!!!"); 
    return 0;
}

或更常见的情形:

int a_stub(){
    fail("Hey!!! I'm actually called! Now you can think about "\ 
    "what behaviour do you want me to have. Do you want me to "\
    "return a specific value?"); 
    return 0;
}

那么,哪里会用得上 exploding fake 呢?比如,你要给遗留代码做单元测试,为了保证单元测试能够顺利编过,你不得不加上百个桩,这样的场景下,你很难有足够的时间先把所有的桩的都实现好,把每个桩的目的、返回值都搞得很清楚。这个时候,如果你先让这些桩先自爆。先通过编译,增加单元测试,然后检查这些自爆的桩是否需要被调用到,是否需要额外的行为,是否需要什么返回值。

2. 可以自动生成exploding fake吗?

我们都知道,在给遗留代码写单元测试的时候,需要用到很多的桩,如果用爆炸桩(exploding fake)也需要很多,是不是有什么办法自动化地生成这些exploding fake呢?

答案肯定是有的,因为这些exploding fake无非是依赖函数的签名,只要照着签名实现桩,并且在执行过程中会打印出相应的输出即可。比如尹哲写的lizard 工具就可以读出所有函数的签名,只要稍微写个脚本就可以自动生成自己需要的exploding fake了。有兴趣的同学可以自己试一下,当然能共享出来就更好了。

实际上,James Grenning已经实现了自动生成 exploding fake 的脚本: 源代码 >>

3. 在动态语言中,exploding fake有用吗?

其实exploding fake的初衷就是让依赖自爆,让程序员知道哪里有依赖,是否需要桩及需要什么样的桩。而动态语言不是基于编译和链接的,当没有依赖项的时间,程序的运行很自然是会失败的,换句话说,它本身已经是自爆类型了。:p

转载请注明出处,阅读原文 >>

你可能感兴趣的:(单元测试中的Exploding Fake)