我应该在我进行单元测试的时候从类中调用方法吗?

时间:2016-07-14 08:49:01

标签: java unit-testing junit

我有一个数据库助手类,它执行插入,删除,保存,连接等操作,我正在为此编写测试。但是,当我编写测试用例时,它是否应该独立于测试类?

应该是这样的: 1 - )

(?=$|\w+:)

(你在这里看到,我使用了' save'方法。)

2 - )

@Test
public void testDelete() throws SQLException {
    // Given
    String dateStr = "09-May-2016";
    String word = "testWord";
    derbyDb.save(dateStr, word, 9);
    derbyDb.save(dateStr, word, 11);

    // When
    assertEquals(2, derbyDb.contain(dateStr, word));
    derbyDb.delete();

    // then
    assertEquals(0, derbyDb.contain(dateStr, word));
}

哪一个是真的还是更好?或者测试单元应该独立于其他功能吗?

编辑:AssertEquals在删除之前添加。

EDIT-2:在第二个选项中,应该只有一种方法可以删除'并且将独立于class.Sso中的其他方法。而不是包含方法应该有一个查询。

2 个答案:

答案 0 :(得分:2)

假设您自己也测试save方法,我会使用1,以便在您将delete的内部实现更改为save时,@Before测试不会中断使用其他一些机制。

或者,您可以在delete方法中插入要删除的记录,以便在实际测试中只有assertEquals(2, derbyDb.contain(dateStr, word));,以明确它是什么在方法中测试。

在任何一种情况下,您都应该在删除前delete,因此您知道derbyDb之后的原因是.closest()

Google在厕所博客上的测试中有一篇与此相关的帖子:"Test Behavior, Not Implementation"

  

独立于实施细节的测试更易于维护,因为每次更改实施时都不需要更改它们。它们也更容易理解,因为它们基本上充当代码示例,显示了您的类的方法可以使用的所有不同方式,因此即使不熟悉实现的人通常应该能够通读测试以了解如何使用上课。

在测试中复制数据库级逻辑是测试实现。您可能需要进行以下更改:

  • 重命名数据库表和列;
  • 更改td类以使用其他底层存储 - 可能您需要内存中的实现,或者您无法使用JDBC连接的内容。

如果您采用了第二种方法,那么您必须去修复测试以及测试中的代码。

如果你采取了第一种方法,那么你就没有。测试中的所有“只是工作” - 或者它没有,但是你知道这是一个错误的实现,而不是错误的测试。

答案 1 :(得分:1)

后者更安全,因为在第一个方法中你冒第一种方法失败的风险 - 如果derbyDb.save()不能正常工作,你可能会在测试方法上出现错误,这可能是误报。

另一方面,如果您对.save()方法进行单独测试,则使用第一个测试会更加清晰。毕竟,如果您的构建在一两次测试中失败,那么它没有太大区别 - 仍然需要修复代码。只需确保测试在其他测试中使用的所有方法。

可能一个好方法是仅使用已在先前测试中测试过的方法。