是否应该将测试数据检查到版本控制中?


40

我正在为处理PDF文件的功能编写一些测试代码。测试背后的基本思想是,将它们指向我专门选择的一些PDF,它们会对其进行处理,然后检查输出是否符合我的期望。

我的问题是:我应该在哪里存储这些大尺寸的PDF?我应该将它们与代码一起检查到版本控制中吗?还是将它们放在其他地方?显然,没有PDF(甚至不同的PDF)的测试代码是没有用的,但是仍然将它们放入我们的存储库中仍然感觉不对。



19
@MichaelKjörling:Tests != Test Data
罗伯特·哈维

4
@RobertHarvey是的,但是如果要进行测试需要测试数据,我认为应该将其视为测试的一部分。据我了解,到目前为止,这也是所有三个答案所采用的方法。
2014年

Answers:


84

您的版本控制系统应包含构建,编译,测试和打包要分发的应用程序所需的所有内容(例如MSI,RPM)。我也认为构建配置和其他脚本也应该在版本控制中。

我应该能够签出一个项目,并具有完整的编译,构建和测试环境。

有两种方法可以检入测试数据。首先,您可以检入测试数据本身(在这种情况下为PDF)。其次,您可以检入可用于生成测试数据的源数据(如果适用)。这可以是加载到包含测试数据的空白数据库中的SQL脚本,也可以是可以编译为PDF或其他文件的基于文本的文件。

其他人可能会不同意将所有内容都检查到版本控制中,但是根据我的专业经验,我发现确保能够从头开始重建完整的环境至关重要。


20
是。绝对没错。现在是2014年,使用无法无缝处理二进制文件的修订控制没有任何道理。
Kilian Foth,2014年

4
我同意,但您绝对想避免同时检查垃圾物品的情况。例如,如果测试数据包括一个“输出”文件夹,其中包含由测试生成的所有pdf文件,那么您将不希望将其包括在存储库中。但是我同意测试本身以及回购所需要的任何软件包都应该属于回购的一部分。
肯尼斯·加萨

1
@KennethGarza确实不难。根据经验,任何原始内容(源代码,测试源代码,测试数据,媒体,[真实]文档,第三方库,构建脚本,工具脚本,转换脚本等)都应包括在内,而所有数据可以在合理的时间内从原始数据生成的数据应该不会。此外,鉴于这些是测试输出,它们可能仅您自己运行测试后才有意义,否则,您不是在测试程序,而是在测试VCS软件保留文件完整性的能力:)
Thomas

1
@ MarnenLaibow-Koser:我致力于检测植入的起搏器导线中的电气故障的项目的测试套件超过40GB。没有一个VCS可以解决这个问题。拥有两个存储库是一个管理难题,但有时它是更好的选择。
whatsisname

1
@ MarnenLaibow-Koser你明白了。集成测试位于单独的存储库中,如果用户希望在本地运行它,则依赖项管理将为他获取zip文件并解压缩。通常,Continuous Integration服务器/服务器场的任务是进行集成测试,并在集成测试通过之前将阻止合并功能分支。
user482745

15

如果没有准备好的安装文件,测试无用,则可以将文件和测试代码一起包括在VCS中。

虽然测试中使用的文件不是代码,但是您可以将它们视为代码所依赖的依赖项。因此,将所有内容保持在一起是有好处的。


作为对策,某些VCS不能很好地处理大型二进制文件,而其他VCS强烈反对在VCS中包括任何类型的二进制文件。如果您遇到这两种情况中的任何一种,那么将测试文件存储在易于访问的众所周知的位置也很有意义。

我还将考虑在测试代码中添加一条注释,指出“ foo.pdf运行所有测试所依赖”。


我没有发现让测试检查测试数据有什么问题,如果找不到,然后尝试获取它(例如,从URL),但如果两者都不起作用,则失败。依靠网络不是一个好主意,因为它会使测试变得更慢,更脆弱。但是尝试的脆弱性要比没有脆弱的多,并且自动获取(和本地缓存)正确的数据要比手动读取文档/注释,将其放置到位要快。
Warbo 2014年

7

如果是静态数据,则将其放入版本控制中。这些文件一旦签入,就不会真正更改。如果不再需要该功能,它们将被删除,或者将在其中添加新的测试文件。无论哪种方式,您都不必担心差的二进制差异占用空间。

如果您正在生成测试数据,例如。随机,那么您应该在测试失败时自动保存它,否则将其丢弃。以这种方式保存的任何数据都应转为常规回归测试,以便将来肯定会测试那些极端情况,而不是依靠抽签的运气。


2
如果您随机生成测试数据,那么您应该真正去买一本有关编写可复制的自动化测试的书。
达伍德说,请

5
@DavidWallace所以,您说的是模糊测试,属性检查和统计软件测试等整个领域不仅是错误的,而且有害吗?
Warbo

5
@DavidWallace随机!=无法复制。
congusbongus

5
@DavidWallace,您可以随便调用它。随机测试数据,记录输入,必要时进行回收,可重复进行。不会导致受伤的世界。
congusbongus 2014年

2
@DavidWallace“不是停止思考实际需要哪些测试用例”,并不意味着“没有随机测试”,而是“ 不仅是随机测试”。至于“您无法复制发现该错误的数据”,您是否真的阅读了您评论的答案?;)
Warbo

0

绝对在测试和主要应用程序代码中包含该数据。拥有一个井井有条的测试套件会很有帮助-因此,如果您正在测试pdf提取(并且您的代码已被很好地封装),那么您应该能够根据应用程序代码的路径来构建测试数据的路径-一直对我有用。

使用git可以设置.gitignore,以防止任何临时输出或测试日志污染您的存储库。

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.