【问题标题】:TDD duplication of test dataTDD重复测试数据
【发布时间】:2011-01-31 13:25:25
【问题描述】:

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

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

这里的情况:

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

【问题讨论】:

    标签: unit-testing testing tdd duplicates duplicate-data


    【解决方案1】:

    与其说“每个函数一个测试”,不如试着把它想象成“每个函数的行为的一个方面”。

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

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

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

    【讨论】:

      【解决方案2】:

      排除测试中的重复。

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

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

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

      【讨论】:

      • 我对 C++ 和 Qt 无能为力,但其他人可能会。
      猜你喜欢
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多