我是测试驱动开发的新手,我第一次尝试在一个简单的项目中使用它。
我有一个类,我需要测试这个类的对象的创建,插入和删除。如果我写三个单独的测试函数,我需要在其他函数中复制初始化代码。如果我将所有测试放在一个测试函数中,那么它与每个函数的一个测试相矛盾。我该怎么办?
情况如下:
tst_create()
{
createHead(head);
createBody(body);
createFoot(foot);
}
tst_insert()
{
createHead(head);
createBody(body);
createFoot(foot);
obj_id=insert(obj); //Also I need to delete obj_id somehow in order to preserve old state
}
tst_delete()
{
createHead(head);
createBody(body);
createFoot(foot);
obj_id=insert(obj);
delete(obj_id);
}
VS
tstCreateInsertDelete()
{
createHead(head);
createBody(body);
createFoot(foot);
obj_id=insert(obj);
delete(obj_id);
}
答案 0 :(得分:6)
而不是“每个功能一次测试”,尝试将其视为“每个功能的行为的一个方面”。
插入物体会给你带来什么?删除一个对象怎么样?为什么这些有价值?你怎么能告诉你已经完成了它们?写一个如何使用代码的例子,以及为什么这种行为很有价值。那就成了你的考验。
当你弄清楚你感兴趣的行为是什么时,只有当它使测试更具可读性时才提取出重复。 TDD不只是测试;它还涉及提供文档,并帮助您考虑代码的每个元素的责任和代码的设计。这些测试的阅读可能远远超过它们的编写,因此必须首先考虑可读性。
如有必要,将您感兴趣的所有行为放在一个方法中,并确保它是可读的。如果需要,您可以添加评论。
答案 1 :(得分:4)
将测试中的重复因素排除在外。
根据您的测试框架,可能支持定义在每次测试执行之前调用的设置方法以及在每次测试之后调用的拆卸方法。
无论如何,您可以提取常见内容,这样您只需重复调用单个共享设置。
如果您告诉我们您使用的语言和测试框架,我们可能会提供更具体的建议。