从外部文件加载或不加载用于单元测试的数据


17

在进行单元测试时,我经常会辩论自己要馈入的数据量,并期望从被测单元中回来,我应该将它们包含在实际的测试文件中。

我不断努力的权衡是:

  • 如果测试的很大一部分(以代码量计)由输入和输出数据组成,那么似乎很难实际读取测试,但是我可以很容易地看到实际的输入和输出。
  • 如果我从文件中加载测试数据,则可以轻松地对可能的数据输入进行一堆测试,轻松地将测试数据重复用于多个测试,但是我必须离开源代码来查看另一个文件,以查看输入的确切含义。 。

其中之一是反模式吗?


什么类型的数据?
乔恩·里德

@JonReid:主要是文字。
DudeOnRock

Answers:


11

要直接回答您的问题-不,我认为正确使用任何一个都不是反模式。

---更详细的答案---

根据我的经验,我认为这在很大程度上取决于测试的目标。这是我过去使用的经验法则,它有助于我做出决定:

您是否正在实际测试一小段代码?(真实的单元测试)

如果是,那么我发现在测试本身内部创建数据要容易得多,因为我可以看到传入的内容。在这些情况下,我通常会寻找要使用的类似Jasmine的库,因为我发现它使创建和维护测试数据更加容易。不过,这是个人喜好-使用使您的工作更轻松的任何方法。

如果否,那么您可能实际上是在测试系统本身。在这些情况下,我经常从外部源加载数据,原因如下:

  1. 该测试不是关于程序员的代码清晰性(尽管这仍然很重要-有人必须维护它),而是关于在整个系统块中运行足够多的不同类型的数据以合理地确保其有效。
  2. 我经常会编写管道代码来加载和使用测试数据,但是数据本身是由其他人(在我的情况下通常是QA工作人员)创建的。这些人通常不是程序员,所以我不能指望他们在编辑代码。

这么长的答案很短,这取决于您要测试的内容以及原因。两种方法都很有用,而且都有自己的位置-选择最适合您情况的方法。


9

我在这里看不到任何取舍。源代码应该描述算法,或者至少描述业务逻辑,而不是大量数据。如果编写傅立叶变换,则要验证窦性音正确映射到单个峰,混合声音正确映射到更多峰等,但是对于将命名文件馈sinus.wav入例程并验证是否足以输出结构就是您所期望的。

当然,从技术上讲,您不能立即保证sinus.wav确实包含正弦波音调,但是正如您所说,在信号源中列出100,000个振幅值也并不能给您带来任何收益-实际上,这更糟,因为您至少可以使用音频播放器播放外部文件以进行检查,而隐藏在源代码中的数据值基本上是无能为力的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.