【问题标题】:How to run integration tests?如何运行集成测试?
【发布时间】:2011-02-02 21:29:48
【问题描述】:

在我们的项目中,我们有大量的单元测试。它们有助于保持项目经过良好测试。

除此之外,我们还有一组测试,它们是单元测试,但依赖于某种外部资源。我们称它们为外部测试。例如,他们有时可以访问网络服务。

虽然单元测试很容易运行,但集成测试有时无法通过:例如,由于超时错误。此外,这些测试可能需要很长时间才能运行。

目前,我们保留集成/外部单元测试只是为了在开发相应功能时运行它们。

对于简单的单元测试,我们使用 TeamCity 进行持续集成。

您如何运行集成单元测试以及何时运行它们?

【问题讨论】:

  • 可能在本次讨论中,我正在研究如何对集成测试进行分类。现在我可以自己添加: 1. 测试检查我们的软件是否按预期与远程软件通信(如 S. Lott 所述,可以使用远程 ws 模型)。 2. 测试以检查远程服务是否按我们的预期工作。

标签: java junit continuous-integration integration integration-testing


【解决方案1】:

在我们的项目中,我们有用于常规/普通单元测试的单独套件和用于集成测试的单独套件。原因有二:

  1. 性能:集成测试要慢得多,
  2. 测试脆弱性:由于与环境相关的条件,集成测试更经常失败(给出误报)。

我们使用 TeamCity 作为主要的持续集成服务器,使用 Maven 作为构建系统。我们使用以下算法来运行测试:

  1. 我们在 Eclipse IDE 内和每次提交之前运行单元测试。
  2. 每次提交 TeamCity 代理后,我们都会使用 Maven 的 mvn clean install 自动运行单元测试
  3. “主”构建完成后,我们会在 TeamCity 代理上自动运行集成测试。

我们触发集成测试执行的方式是将 TeamCity 的 integration.tests 任务配置为依赖于“main” continous.build 任务,详细信息请参见此处:http://confluence.jetbrains.net/display/TCD4/Dependencies+Triggers

我们只运行集成测试(不包括单元测试):

  • 使用单独的目录命名 "src/it/java" 保持集成 测试,
  • 默认情况下从 maven-surefire-plugin 配置中排除此源文件夹(配置/排除元素),
  • 使用名为“integration”的 Maven 配置文件排除常规单元测试并包含来自“src/it/java”的测试(此配置文件通过在 integration.tests 任务中传递 -Pintegration 进行配置)。

【讨论】:

  • 这对我来说是最接近的选择,除了我们会用模型替换一些集成测试到单元测试。
【解决方案2】:

我们使用 Maven2: maven-surefire-plugin 运行单元测试(在测试阶段)和 maven-failsafe-plugin 进行集成测试(集成测试阶段)。

默认情况下,构建项目时会运行所有测试,但是可以使用配置文件关闭集成测试。

在许多情况下,集成测试是模块的一部分,在某些情况下,还有专门的模块只进行集成测试。

其中一个团队还使用 Fitnesse 进行验收测试。这些测试也在专用模块中。

我们将 Hudson 用于 CI。

【讨论】:

  • 感谢您提及 Fitnesse - 我以前听说过。现在刚刚观看了演示文稿 - 它来自罗伯特马丁。看起来不错。我会尝试考虑如何将它整合到我们的目的!您在 Fitnesse 有很多验收测试吗?
  • 我的团队 - 不,其他团队确实做了很多验收测试。
【解决方案3】:

我们在一个巨大的套件中运行所有测试。运行需要 7 分钟。

我们的集成测试会创建模拟服务器。它们从不超时——除非测试要求服务器超时。

所以我们有以下几种东西。 (代码示例为 Python)

class SomeIntegrationTest( unittest.TestCase ):
    def setUp( self ):
        testclient.StartVendorMockServer( 18000 ) # port number
        self.connection = applicationLibrary.connect( 'localhost', 18000 )
    def test_should_do_this( self ):
        self.connection.this()
        self.assert...
    def tearDown( self ):
        testClient.KillVendorMockServer( 18000 )

这有一些限制——它总是为每个测试分叉客户端模拟服务器。有时这没关系,有时开始和停止太多了。

我们还有以下几样东西

class SomeIntegrationTest( unittest.TestCase ):
    def setUp( self ):
        self.connection = applicationLibrary.connect( 'localhost', 18000 )
    def test_should_do_this( self ):
        self.connection.this()
        self.assert...

 if __name__ == "__main__":
     testclient.StartVendorMockServer( 18000 ) # port number
     result= unittest.TextTestRunner().run()
     testclient.KillVendorMockServer( 18000 )
     system.exit( result.failures + result.errors )

为了支持这种测试,我们有许多模拟服务器用于各种集成测试。

【讨论】:

  • 您是否要求开发人员在签入前运行测试?
  • 这是模拟远程服务的好方法。我认为我们不这样做是因为有时很难制作模型 - 或者可能需要一些时间。有时我什至不知道远程 ws 是如何工作的。第三件事是,有时测试远程服务是否按预期正常工作很有帮助。我们有一个案例,主要服务提供商存在一些外部测试可能会发现的问题。
  • @Vladimir:“有时我什至不知道远程 ws 是如何工作的”。错误的。您知道您的应用程序发送和接收什么。这就是您在 Mockup 中必须处理的全部内容。仅此而已,足以使测试通过。
  • @matt b:当然。是的,运行完整的测试套件需要时间。软件复杂而困难,需要进行实际测试。
  • @S.Lott,我同意,我们应该制作模型来证明远程 ws 可以正常工作。但是还有另一个阶段 - 当您第一次使用某些远程 ws 进行开发时。或者当 ws 更改协议时。您是否有这样的测试来检查 ws 在您的模型中是否按预期工作?
【解决方案4】:

我们使用 Jenkins 自动运行我们的测试。

注意单元和集成 - 测试之间的差异。谈论“集成单元测试”令人困惑

Maven 提供了很好的支持来区分单元测试和集成测试—— Failsafe & Surefire 插件。

来自 Apache Maven 项目: Failsafe 插件旨在运行集成测试,而 Surefire 插件旨在运行单元测试。 (见:http://maven.apache.org/surefire/maven-failsafe-plugin/) 您需要在 pom.xml 中配置这些插件

然后您只使用mvn test - 运行单元测试或mvn verify 运行集成测试。

单元测试应该定期运行 f.i.每 15 分钟 集成测试,通常需要很长时间,并且应该运行 f.i.每 24 小时一次。

希望对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2012-12-02
    • 2020-01-31
    • 1970-01-01
    • 2013-06-24
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多