我正在尝试为我的应用程序实现自动集成测试。这是一个非常复杂的怪物。您可以说它的数据库和文件系统的一部分是其状态的一部分,因为它将图像文件保存在硬盘驱动器中,并引用数据库中的文件。该软件需要处于连贯状态的所有这些软件才能正常工作。
回到编写测试:要运行任何相关的测试,我需要文件系统中的一些图像文件,并在数据库中填充某些记录。我想把所有这些放在存储库中名为TestEnvironmentData的单独文件夹中,并从Continuous Integration Server(团队城市)中检索它们,但是一位同事说回购已经很满了,我应该设置一个特殊目录和数据库,仅在Continuous Integration服务器中。我不喜欢这样,因为测试成功取决于我手动维护服务器中的内容,并在每次测试变得繁琐之前恢复初始状态。
当你需要为这样的应用程序编写集成测试时,你们做了什么?主要目标是使用自动化测试工具进行大规模重构。有很多意大利面条代码,应用程序的当前架构几乎不能进行单元测试,这就是我首先决定集成测试的原因。
欢迎任何替代方法。
答案 0 :(得分:1)
首先,我们使用Maven来构建我们的代码。它就像蚂蚁,但它依赖于惯例而不是像许多东西那样的配置,比如Ruby On Rails。其中一个约定是标准化的目录结构:
(project)----src----main----(language)
| | \--resources
| \--test----(language)
| \--resources
\--target---...
使用这样的目录结构可以很容易地保持您的应用程序资源和测试资源彼此接近,但仍然可以构建用于测试或构建生产,或者只是构建两者,但只是在运行后打包应用程序部分测试。
就在测试之间重置数据库而言,如何执行此操作在很大程度上取决于您正在使用的DBMS。例如,如果您正在使用MySQL,则可以非常轻松地以您希望的方式获取测试数据,并对测试前加载的文件执行mysqldump。对于其他DBMS,您可能必须删除并重新创建表并重新加载数据,或者为起点和use a CREATE/SELECT sql statement to duplicate it each time创建单独的表。
“在测试之间重置数据库”步骤确实没有可靠的方法。
答案 1 :(得分:1)
开发人员可重复性是设置Continous Integrations Server时的关键。我为我的最后三个雇主设置了一个,我发现成功的关键是开发人员能够从他们的开发系统运行相同的测试,以获得与CI服务器相同的结果。
执行此操作的最简单方法是将测试工件签入到源代码管理中,但您也可以使用dropbox或在其中一个构建步骤中复制它们的网络共享。
对于.Net解决方案,我一直使用MsBuild,因为您可以最轻松地复制Visual Studio的构建过程并获得相同的二进制文件/可部署文件。至于保持数据库同步以便以前测试可重复,我使用了MbUnit测试框架和[Rollback]属性,因为它会回滚测试中发生的对Sql Server的任何更改。我相信Nunit现在也有这个属性。
CI服务器非常适合查找破坏现有功能的代码,但除非开发人员能够在其计算机上重现错误,否则他们将不会信任CI服务器一段时间。