4

我是测试驱动开发的新手,我第一次尝试在一个简单的项目中使用它。

我有一个类,我需要测试这个类的对象的创建、插入和删除。如果我编写三个单独的测试函数,我需要在其他函数中复制初始化代码。另一方面,如果我将所有测试放在一个测试函数中,那么它与每个函数一个测试是矛盾的。我应该怎么办?

这里的情况:

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);
}

对比

tstCreateInsertDelete()
{
   createHead(head);
   createBody(body);
   createFoot(foot);

   obj_id=insert(obj);

   delete(obj_id);
}
4

2 回答 2

6

而不是“每个函数一个测试”,试着把它想象成“每个函数的行为的一个方面”。

插入一个对象会给你什么?删除对象怎么样?为什么这些有价值?你怎么能说你已经做到了?写一个如何使用代码的例子,以及为什么这种行为是有价值的。那将成为您的测试。

当您确定了您感兴趣的行为是什么时,只有当它使测试更具可读性时才提取重复项。TDD 不仅仅是测试;它还涉及提供文档,并帮助您考虑每个代码元素的责任和该代码的设计。测试的阅读量可能远远超过编写量,因此可读性必须放在首位。

如有必要,将您感兴趣的所有行为放在一种方法中,并确保它是可读的。如果需要,您可以添加评论。

于 2011-01-31T15:30:47.400 回答
4

将测试中的重复因素排除在外。

根据您的测试框架,可能支持定义在每次测试执行之前调用的 setup 方法和在每次测试之后调用的 teardown 方法。

无论如何,您可以提取通用内容,这样您只需重复调用单个共享设置即可。

如果您告诉我们您使用什么语言和测试框架,我们或许可以提供更具体的建议。

于 2011-01-31T14:19:50.883 回答