使用jUnit进行数据驱动的测试

时间:2009-11-30 20:52:50

标签: java unit-testing junit data-driven-tests

你在jUnit中用什么来编写数据驱动的测试?

(我的定义)数据驱动测试是从一些外部源(文件,数据库......)读取数据,每行/文件/执行一次测试,并在测试中显示结果的测试跑步者就好像你有单独的测试一样 - 每次跑步的结果都是单独显示的,而不是在一个巨大的聚合中。

10 个答案:

答案 0 :(得分:39)

在JUnit4中,您可以使用Parameterized testrunner进行数据驱动测试。

它没有很好的文档记录,但基本思想是创建一个静态方法(注释为@Parameters),返回一个Object of Array数组。这些数组中的每一个都用作测试类构造函数的参数,然后可以使用构造函数中设置的字段运行常用的测试方法。

您可以编写代码来读取和解析@Parameters方法中的外部文本文件(或从其他外部源获取数据),然后您可以通过编辑此文件来添加新测试而无需重新编译测试。

答案 1 :(得分:9)

这是TestNG及其@DataSource的亮点。这就是为什么我更喜欢JUnit的原因之一;其他是依赖项和并行线程测试。

答案 2 :(得分:8)

我使用内存数据库,例如hsqldb,以便我可以使用“生产样式”数据集预先填充数据库,或者我可以从空的hsqldb数据库开始并填充它我需要执行测试的行。最重要的是,我将使用JUnitMockito编写测试。

答案 3 :(得分:4)

我使用dbUnitjMock和jUnit 4的组合。然后你可以将它作为套件或单独运行

答案 4 :(得分:3)

最好使用适合您需求的“DataDrivenTestCase”扩展TestCase。 这是工作示例: http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

与参数化测试不同,它允许使用命名良好的测试用例。

答案 5 :(得分:1)

我正在使用@ DroidIn.net,这正是我正在做的事情,但是要按字面意思回答你的问题“并在测试运行器中显示结果,就好像你有单独的测试一样,”你必须看看JUnit4参数化的跑步者。 DBUnit不这样做。如果你必须做很多这样的事情,说实话,TestNG更灵活,但你绝对可以在JUnit中完成它。

您还可以查看JUnit Theories运行器,但我的回忆是它对于数据驱动的数据集并不好,这种情况有意义,因为JUnit不是处理大量外部数据。

答案 6 :(得分:1)

即使这是一个相当古老的主题,我仍然想到贡献我的份额。 我觉得JUnit对数据驱动测试的支持越来越不友好。例如。为了使用参数化,我们需要编写我们的构造函数。使用Theories runner,我们无法控制传递给测试方法的测试数据集。

此博客文章系列中指出了更多缺点:http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html

现在有一个全面的解决方案以EasyTest的形式出现,它是一个从JUnit扩展出来的框架,旨在为用户提供大量功能。它的主要重点是使用JUnit执行数据驱动测试,尽管您不再需要实际依赖JUnit。以下是refernece的github项目:https://github.com/anujgandharv/easytest

如果有人有兴趣提供他们的想法/代码/建议,那么现在是时候了。您只需转到github存储库并创建问题。

答案 7 :(得分:0)

通常,数据驱动测试使用一个小的可测试组件来处理数据。 (文件读取对象或模拟对象)对于数据库和应用程序之外的资源,模拟用于模拟其他系统。 (Web服务和数据库等)。通常我看到有外部数据文件处理数据和输出。这样,数据文件就可以添加到VCS中。

答案 8 :(得分:0)

我们目前有一个道具文件,里面有我们的身份证号码。这非常脆弱,但很容易搞定。我们的计划是在我们的ant构建中最初使用-D属性覆盖这些ID号。

我们的环境使用的遗留数据库具有可怕的交织数据,在运行之前无法加载(例如通过dbUnit)。最后,我们想到单元测试查询数据库以找到具有被测属性的ID,然后在单元测试中使用该ID。这将是缓慢的,更恰当地称为集成测试,而不是“单元测试”,但我们将针对实际数据进行测试,以避免我们的应用程序与测试数据完美匹配但实际数据失败的情况。

答案 9 :(得分:0)

有些测试会使自己受到界面驱动。

如果通过接口调用检索数据库/文件读取,那么只需单元测试来实现接口,单元测试类就可以返回您想要的任何数据。

相关问题