31

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

(我的定义)数据驱动测试是从某个外部源(文件、数据库等)读取数据,每行/文件/任何内容执行一个测试,并在测试运行器中显示结果的测试你有单独的测试 - 每次运行的结果都是单独显示的,而不是一个巨大的聚合。

4

10 回答 10

40

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

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

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

于 2009-11-30T21:36:51.233 回答
10

这就是 TestNG 的@DataSource亮点所在。这就是我更喜欢它的原因之一JUnit。其他的是依赖项和并行线程测试。

于 2009-11-30T23:30:31.377 回答
8

I use an in-memory database such as hsqldb so that I can either pre-populate the database with a "production-style" set of data or I can start with an empty hsqldb database and populate it with rows that I need to perform my testing. On top of that I will write my tests using JUnit and Mockito.

于 2009-11-30T21:55:58.220 回答
4

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

于 2009-11-30T20:56:16.073 回答
3

您最好TestCase使用DataDrivenTestCase适合您需求的扩展。

这是工作示例: http: //mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

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

于 2012-08-24T23:44:32.103 回答
1

I'm with @DroidIn.net, that is exactly what I am doing, however to answer your question literally "and displays the results in a test runner as if you had separate tests," you have to look at the JUnit4 Parameterized runner. DBUnit doesn't do that. If you have to do a lot of this, honestly TestNG is more flexible, but you can absolutely get it done in JUnit.

You can also look at the JUnit Theories runner, but my recollection is that it isn't great for data driven datasets, which kind of makes sense because JUnit isn't about working with large amounts of external data.

于 2009-11-30T23:11:42.570 回答
1

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

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

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

如果有人有兴趣贡献他们的想法/代码/建议,那么现在是时候了。您可以简单地转到 github 存储库并创建问题。

于 2012-08-20T13:24:17.570 回答
0

我们目前有一个道具文件,其中包含我们的 ID 号。这是非常脆弱的,但很容易让事情发生。我们的计划是最初在我们的 ant 构建中让这些 ID 号可以被 -D 属性覆盖。

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

于 2009-11-30T21:28:15.760 回答
0

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

于 2009-11-30T20:55:42.523 回答
0

一些测试将使其成为接口驱动的。

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

于 2009-11-30T22:52:19.210 回答