2011-03-19 18 views
1

我已经写了删除实体的测试用例。在测试案例中,我只需通过选择查询选择第一条记录,并将其ID传递给删除方法。我想要删除的实体可能有一些子实体限制它的删除。所以我想我应该先在我的删除测试案例中创建一个实体,然后销毁它们,这样我就不会面临孩子依赖的问题。 在删除之前编写用于创建实体的代码是不错的做法。它的一种测试方法创建之前删除method.Please建议设计实践:在删除测试用例中删除之前创建的代码?

编辑: 我的工作轨道平台,让我有像固定装置(没有使用目前,面临着一些误差同样装载数据库的功能,请参阅本https://stackoverflow.com/questions/5288142/rails-fixture-expects-table-name-to-be-prefixed-with-module-name-how-to-disable)。是的,我正在使用配置在测试用例运行后恢复数据库状态。

+0

您没有指定是否使用DAL,所以我会以任何方式发声:)您应该使用抽象DAL进行数据库访问,并编写两组单元测试。一组将违反使用DAL的高级代码(并且嘲笑DAL--摆脱数据库)。另一组将违背DAL本身(这需要一个数据库到位)。通过这种方式,您可以最大限度地降低测试数据/测试设置逻辑的复杂性,并将您更复杂测试中的依赖性降至最低。 – 2011-03-19 09:42:18

回答

1

在测试情况下,我简单收拾第一 记录通过选择查询

这是不对的。你不应该在单元测试中执行查询。

测试,我看可以是:

  1. 删除存在的;
  2. 删除一个非 存在的实体;
  3. 删除一个孩子;
  4. 删除一个不存在的孩子;
+0

删除现有对象需要查询以确定存在哪些对象。你的第一个测试用例需要这一步。 – 2011-03-19 09:37:56

+0

这就是测试双打的目的。当你想要测试的是当代码行为正确或者不存在时,依赖磁盘上或网络上的实际存储介质是一个非常糟糕的主意 – kai 2016-02-20 11:50:53

2

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

许多测试框架都支持这种操作。通常你不会通过外部查询来做到这一点;例如,您可以直接创建具有某些属性的对象,而不是执行外部公开的create查询。由于您直接创建对象,因此您并未测试创建查询代码(除非您内部创建对象的方式存在缺陷,但如果您担心这一点,则可以对其进行测试),以及你的删除代码是唯一被测试的东西。

+0

如果你可以放置一组已知数据(例如恢复数据库,或者将所有测试包装在单个事务中,并在完成后回滚),这可能也是一个不错的选择。这样,除了您正在测试的那些测试外,您不必在测试期间执行任何数据库操作,因此出现问题的可能性会更小。 – 2011-03-19 09:47:06

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()。如果在每次测试运行之前无法设置标准测试数据集,这是一个很好的解决方法。

+0

听起来不错,不知道是不是很好的主意,再次从删除调用创建测试用例(我想这是你的代码中声明的声明)。将看看它是否可以在rails上完成 – 2011-03-19 09:55:22

+1

@Maddy - 创建测试只运行一次。如果成功,则调用删除测试并从创建测试传递返回值。它不会改变测试运行的次数,它只是允许一次测试中的失败来阻止另一次测试。 – 2011-03-19 22:15:39

1

在删除之前编写实体创建代码是不错的做法。它的一种创造测试方法删除之前method.Please建议

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

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

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