【问题标题】:TDD - what's the approach with this sort of dependent sequence situation?TDD - 这种依赖序列情况的方法是什么?
【发布时间】:2016-04-28 12:59:00
【问题描述】:

我目前正在掌握 Lucene 索引,并且对使用 TDD 时的“正确”方法摸不着头脑。

为此,您必须创建一个 IndexWriter,根据一个简单的文本(字符串)集合生成索引,这些文本(字符串)经过标记化、词干化等。

要在此索引中查找查询,您必须创建 DirectoryReader、进行查询、获取命中等。

所以在制作我的第一个测试类(JUnit 4)的过程中,我一个一个地完成了这些步骤,为这个过程中的每个步骤创建了一个新的测试方法,最终产生非零的命中数,如果一切顺利的话。

我遇到的问题是,最后一个测试方法完成了所有这些步骤:清除索引目录、创建 IndexWriter、创建索引等,最后计算命中数。最后一种方法最终可能会被沿途的任何错误所绊倒。而且,之前的方法都显得多余……!而且似乎没有“嘲笑”的机会出现......

这是“测试套件”的候选者吗? TDD Pro 如何针对这种情况开发“适当的”测试?

【问题讨论】:

    标签: unit-testing junit tdd


    【解决方案1】:

    在我看来,您提到的最后一个测试方法更像是集成测试而不是单元测试。单元测试应该只测试一个非常具体的代码单元(通常是一个方法或方法的一部分),并且应该模拟与其他类的任何交互,不应该触及数据库、文件系统或特定代码单元之外的任何东西测试。听起来您创建的第一个测试是单元测试,最后一个测试是集成测试。两种类型的测试之间有一些冗余是可以的,因为单元测试正在测试非常具体的逻辑片段,而集成测试则测试这些片段之间的交互。

    【讨论】:

    • 谢谢...实际上在最后一个测试之前的测试也(必须)做很多事情:创建索引,并测试它是否可以打开索引进行查询...换句话说大约有 4 个步骤:第一个测试方法执行 1 个步骤,第二个执行 2 个步骤,第三个执行 3 个,第四个执行 4 个。没有办法“模拟”这些测试的任何先决条件,因此需要进行尴尬的重复。此外,没有办法不接触文件系统......所以,是的,这些似乎是集成测试......作为一个新手,我只是想知道专业人士如何处理这种情况。
    • 如果没有办法模拟外部交互,我会感到惊讶。这通常是可能的,但并不总是可行的。你总是必须衡量你从努力中获得的价值,所以在这种情况下,只写集成测试可能是要走的路。我从您的描述中想知道您的测试是否相互依赖。这通常是不好的做法,因为它使查明错误变得更加困难,尽管可能有一些案例证明它是合理的。您还需要确保您的 junit 版本可以保证运行顺序。
    • 再次感谢...是的,我目前正在尝试使用 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2020-03-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多