我们的团队拥有数百集成测试创下了数据库,并验证结果。 我已经得到了所有的集成测试两个基类,一个用于检索,仅测试,一个用于创建/更新/删除测试。 唯一的检索基类再生TestFixtureSetup在数据库中,因此它只每个测试类执行一次。 的CUD基类再生每次试验前的数据库。 每个仓库类都有其相应的测试类。
你可以想像,这件事需要相当长一段时间(接近7-8分钟跑和快速增长)。 有了这个运行作为我们的CI(CruiseControl.Net)的一部分,是没有问题的,但在本地运行需要很长的时间,真正禁止提交代码之前运行它们。
我的问题是在那里帮助加快这些类型的集成测试的执行的最佳做法?
我无法在内存中执行这些(一拉sqlite的),因为我们使用的是不支持的SQLite数据库的一些特定功能(计算列等)。
此外,整个团队必须能够执行它们,所以除非连接字符串对于这些实例都是一样运行它们的SQL Server Express或某事的本地实例可能是容易出错。
你是如何在你的店铺实现这个和什么工作呢?
谢谢!
让您快速(单位)和慢速(集成)测试分开,这样就可以分开运行。 /使用任何方法进行分组分类测试是由测试框架提供。 如果测试框架不支持分组测试,将测试整合到一个只有集成测试单独的模块。
快速测试应该只需要几秒钟来运行所有这些,应具有高的代码覆盖率。 这些类型的测试,允许开发人员无情地重构,因为他们可以做一个小的变化,并运行所有测试,并且是非常有信心的变化没有破坏任何东西。
缓慢的测试可以采取许多分钟跑,他们将确保各个组件协同工作的权利。 当开发商这样做有可能会打破一些东西,通过集成测试而不是单元测试测试的变化,他们应该在提交之前运行的集成测试。 否则,慢测试由CI服务器上运行。
在NUnit的,你可以用一个属性如装饰你的测试类(或方法):
[Category("Integration")]
public class SomeTestFixture{
...
}
[Category("Unit")]
public class SomeOtherTestFixture{
...
}
然后,您可以规定在所有类别获得在服务器上运行的构建过程,只是需要你的开发人员遇到可用的测试类别的子集。 他们需要运行将取决于事情比我会把你会更好地了解类别。 但关键是,他们能够在单元级测试和服务器处理的集成测试。
我是一个Java开发者,但已经处理了类似的问题。 我发现,运行的本地数据库实例效果很好,因为速度的(没有数据通过网络发送),也因为这样,你不必在你的集成测试数据库争。
我们用它来解决这一问题的一般方法是建立构建脚本来读取配置文件中的数据库连接字符串,然后设置每个环境中的一个文件。 例如,一个文件工作站,另一个用于CI。 然后你建立构建脚本读取基于特定环境中的配置文件。 因此,建立在使用工作站配置的开发人员工作站运行运行,并在CI环境将运行使用CI设置。
它也有极大的帮助,如果整个数据库模式可以从一个脚本来创建,因此每个开发人员可以快速建立一个用于测试的本地数据库。 你甚至可以这个概念延伸到一个新的水平,并添加数据库设置脚本来构建过程,所以整个数据库的设置可以编写脚本,以跟上数据库模式的变化。
我们有相同的DB定义运行每个开发机器的SQL Server Express实例作为开发环境的一部分。 使用Windows身份验证连接字符串是稳定的 - 字符串中没有用户名/密码。
我们真正喜欢做的事,但现在还没有,就是看看我们是否能够让我们的系统上运行的SQL Server精简版 ,它就像SQLite的与SQL Server的引擎。 然后,我们可以并行存储器内运行它们,以及可能还有(具有多个进程)。
你做任何测量(使用定时器或类似),以确定测试花费大量的时间呢?
如果你已经知道数据库的娱乐就是为什么他们是费时不同的方法将是一次重新生成数据库,并使用事务保持测试之间的状态。 每个CUD型试验中设置启动一个事务,并执行在拆卸回滚。 这可以显著减少花费在数据库设置为每个测试的时间,因为一个事务回滚于一个完整的数据库休闲便宜。