设计实践:在删除测试用例中删除之前创建的代码?

时间:2011-03-19 09:20:36

标签: unit-testing testing design-patterns testcase

我已经编写了删除实体的测试用例。在测试用例中,我只需通过select查询选择第一条记录,并将其id传递给删除方法。我想要删除的实体可能有一些子实体限制它删除。所以我想我应该首先在我的删除测试用例中创建一个实体然后销毁它,这样我就不会遇到子依赖问题。 在删除之前编写用于创建实体的代码是一种好习惯。它是一种在删除方法之前的测试创建方法。请建议

修改 我正在使用Rail平台,所以我有一些功能,例如使用fixtures加载数据库(当前没有使用,遇到一些错误,请参阅此https://stackoverflow.com/questions/5288142/rails-fixture-expects-table-name-to-be-prefixed-with-module-name-how-to-disable)。是的,我在测试用例运行后使用配置来恢复数据库状态。

4 个答案:

答案 0 :(得分:2)

在单元测试中,通常在运行测试之前执行某种设置。

许多测试框架都支持这种操作。通常,您不会通过外部查询来执行此操作;例如,您可以直接创建具有特定属性的对象,而不是执行外部公开的create查询。

因为你首先直接创建了对象,所以你没有测试你的创建查询代码(除非你内部创建对象的方式有缺陷,但是如果你关心它,你也可以测试它),以及你的删除代码是唯一被测试的东西。

答案 1 :(得分:1)

  

在测试用例中,我先选择       按选择查询记录

这是错误的。您不应该在单元测试期间执行查询。

我看到的测试可以是:

  1. 删除现有的;
  2. 删除非 存在的实体;
  3. 删除孩子;
  4. 删除不存在的孩子;

答案 2 :(得分:1)

如果您的单元测试框架允许测试依赖性,即仅在测试Y通过并且将Y的返回值作为参数传递给X时运行测试X,您可以侥幸逃脱。以下是PHP的外观:

function setUp() {
    $this->dao = new UserDao(...);
}

function testCreate() {
    $user = $this->dao->create('Bob');
    assertThat($user, notNullValue());
    // more assertions about the new user
    return $user->getId();
}

/**
 * @depends testCreate
 */
function testDelete($id) {
    assertThat($this->dao->delete($id), is(true));
}

如果testCreate()失败,PHPUnit将跳过testDelete()。如果在每次测试运行之前无法设置标准测试数据集,那么这是一个很好的解决方法。

答案 3 :(得分:1)

  

在删除之前编写用于创建实体的代码是一种好习惯。它是一种在删除方法之前的测试创建方法。请建议

是的,最好创建正在测试其删除的实体,以便测试不依赖于外部状态,并且可以独立于其他测试重复。

这不是测试创建,但使用创建,以便设置测试删除。

如果您有多个依赖于相同数据的测试,则可以将创建提取到您在需要该数据的每个测试中调用的方法。大多数测试框架还有一种机制,用于指定在每次测试之前运行的setup方法,如果测试类中的所有测试都需要数据,则可以将创建放在那里。