1

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

编辑: 我在 Rail 平台上工作,所以我有像加载数据库这样的功能(当前不使用,面临一些相同的错误,请参阅此https://stackoverflow.com/questions/5288142/rails-fixture-expects-table -name-to-be-prefixed-with-module-name-how-to-disable)。是的,我正在使用配置在测试用例运行后恢复数据库状态。

4

4 回答 4

2

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

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

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

于 2011-03-19T09:28:00.347 回答
1

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

是的,创建您正在测试其删除的实体是一种很好的做法,这样测试不依赖于外部状态,并且可以独立于其他测试重复。

这不会测试创建,而是使用创建来设置测试删除。

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

于 2011-03-19T14:46:17.047 回答
1

在测试用例中,我只需通过选择查询选择第一条记录

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

我看到的测试可以是:

  1. 删除一个存在的;
  2. 删除一个不存在的实体;
  3. 删除一个孩子;
  4. 删除一个不存在的孩子;
于 2011-03-19T09:27:39.843 回答
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()。如果您无法在每次测试运行之前设置标准测试数据集,这是一个很好的解决方法。

于 2011-03-19T09:30:48.427 回答