0

我正在尝试为我的应用程序实现自动化集成测试。这是一个非常复杂的怪物。你可以说它的数据库和文件系统的一部分是它的状态的一部分,因为它将图像文件保存在硬盘驱动器中,并引用数据库中的那些文件。软件需要所有这些,在连贯的状态下,才能正常工作。

回到编写测试:要运行任何相关测试,我需要文件系统中的一些图像文件,以及在数据库中填写的某些记录。我想把所有这些都放在存储库中一个名为 TestEnvironmentData 的单独文件夹中,然后从持续集成服务器(Team City)中检索它们,但一位同事说 repo 已经很满了,我应该设置一个特殊目录和数据库,仅在持续集成服务器中。我不喜欢这样,因为测试成功取决于我手动维护服务器中的内容,并在每次测试变得繁琐之前恢复初始状态。

当你需要为这样的应用程序编写集成测试时,你们会怎么做?主要目标是拥有一个自动化测试工具来进行大规模重构。有很多意大利面条式的代码,应用程序的当前架构很难进行单元测试,这就是我决定首先进行集成测试的原因。

欢迎任何替代方法。

4

2 回答 2

1

首先,我们使用 Maven 来构建我们的代码。它就像 ant,但它在很多事情上都依赖于约定而不是配置,就像 Ruby On Rails 一样。其中一个约定是标准化的目录结构:

(project)----src----main----(language)
          |      |       \--resources
          |      \--test----(language)
          |              \--resources
          \--target---...

使用这样的目录结构可以很容易地让您的应用程序资源和测试资源彼此靠近,但仍然能够构建用于测试或构建用于生产,或者只是构建两者但只是在运行测试后打包应用程序部分。

至于在测试之间重置数据库,您如何执行此操作在很大程度上取决于您使用的 DBMS。例如,如果您使用的是 MySQL,那么很容易以您想要的方式获取测试数据,并对文件执行 mysqldump,然后在测试前加载。对于其他 DBMS,您可能必须删除并重新创建表并重新加载数据,或者为起点制作单独的表并使用 CREATE/SELECT sql 语句每次复制它

“在测试之间重置数据库”步骤确实没有可靠的方法。

于 2012-04-12T18:01:29.170 回答
1

设置持续集成服务器时,开发人员的可重复性是关键。我为我的最后三位雇主设置了一个,我发现成功的关键是开发人员能够从他们的开发系统运行相同的测试,以获得与 CI 服务器相同的结果。

最简单的方法是将测试工件签入源代码控制,但您也可以使用您在构建步骤之一中复制它们的 Dropbox 或网络共享。

对于 .Net 解决方案,我一直使用 MsBuild,因为您可以最轻松地复制 Visual Studio 的构建过程并获得相同的二进制文件/可部署文件。至于保持数据库同步以便过去可以重复测试,我使用了 MbUnit 测试框架和 [Rollback] 属性,因为它会回滚测试中发生的对 Sql Server 的任何更改。我相信 Nunit 现在也有这个属性。

CI 服务器非常适合查找破坏现有功能的代码,但除非开发人员可以在他们的机器上重现错误,否则他们在一段时间内不会信任 CI 服务器。

于 2012-04-12T19:07:58.360 回答