标签:overflow strong tac 静态 参与 同事 开始 怎样 为什么
在上一个项目上,由于项目成员大部分是新入职的同事,所以对于测试不是很熟悉,
这就导致了在项目前期,项目上的很多测试都不太make sense,虽然没有什么定量的东西来描述,
但是总结起来就2个点:
对于这一个问题,是因为很多刚开始写测试的开发脑子里不会快就想到given、when、then这三个词,
一般我们写测试写得比较多的同事,都会使用should_return_xxxx_when(if)_xxxx
。其实就是在脑子中
想到了given、when、then。而新同事照着模仿的时候,很可能就单纯地写了should_xxx
。他们只考虑了结果,
但是没有考虑条件,这就导致了读名字还是get不到测试想要干什么。
对于这个问题,我想起了多年前在stackoverflow上面看到的一种写测试名字的模板,他是这样推荐的:
GivenA_WhenB_C
,我觉得这中写法挺好的,所以在项目中用了起来,结合实际使用,我又对此提出了两个改进:
___
(也就是3个_
),因为经过试验,发现2个_
太短了不容易一眼看出分隔最终的效果是这样的(这是一个例子,来自最近我参加的DDD进阶培训中的训练题):
parking_order_is_natural_order___park_cars_by_parking_assistant___car_parked_to_correct_parking_lot_in_turn
car_is_already_took___take_back_car_with_used_receipt___exception_is_thrown
parking_lot_is_available___park_a_car_by_parking_assistant___receipt_returned
car_is_parked___take_back_car_with_invalid_receipt___exception_is_thrown
这里还有一个小技巧,如果一个测试真的没有given的时候,或given不重要的时候,可以省略,但是___
不能省略:
___xxx_xxx___xxx_xxx
可以总结一下这种命名方式的优点:
当然,也是有缺点的:
我用这种方式写出来的测试名字一般都比较长,这个有可能是我用词还不够精炼,在given、when的部分可能有时候是有一部分重复的
所以也需要刻意练习,学会精简用词。
最后,给这种命名方式命个名吧,就叫GWT测试命名法好了。
我在项目上发现,很多人习惯在构建fake数据的时候直接将所有信息屏蔽,就提供一个createX()的方法,
在createX的方法里面可能还要构建X的构成部分:
X createX() {
Y yyy = new Y;
X xxx = new X(YYY, field1, field12);
return xxx;
}
除了createX外还有createAX、createBX,然后在不同的测试里面混合调用。
作为看测试的我,我就很难看到到底需要一个怎样的场景,field1到底是怎么设置的,field2到底是怎么设置
的,而且在想改一下createX的时候,还会牵扯到其他的测试莫名其妙就挂了。
我目前使用的解决方式是这样的:
先要确定好测试要涉及到的重要信息,比如上面如果field1,field2都会对测试的逻辑起到作用,
那么,即使冗余,也一定要写在测试方法内。比如:
@Test
void ___xxx___xxx() {
Y y = createY();
X x = createX(field1, field12, y)
// do some thing
// assert some thing
}
这么做的好处是,当我要看某一个测试的时候,它的前置数据我一眼就能看出来,不需要不停地command+b跟进去才知道需要什么。
在应用第一条原则的时候,一定要记得,只罗列出这个测试所关心的数据。假如field3完全不参与这次
逻辑的处理,又必须要有值,那么,在createX内部给个默认值即可,不需要放在createX参数列表中。
其实之前也试过用builder,但是看起来太多了,适用create的方式能缩短要写得代码行数,更容易一眼看完测试。
标签:overflow strong tac 静态 参与 同事 开始 怎样 为什么
原文地址:https://www.cnblogs.com/boydfd/p/12393112.html