【问题标题】:Configure SQL Test with Teamcity integration使用 Teamcity 集成配置 SQL 测试
【发布时间】:2014-02-02 03:48:33
【问题描述】:

我正在使用 SQL Test 在 SQL Server 中创建一些单元测试。我与 Teamcity 集成,以便在构建时自动运行 tSQLt 测试。

问题是我们计划为我们所有的商店过程创建数百个单元测试。而且我们不想在每次签入代码时都运行所有单元测试,而 Teamcity 运行构建 + 运行所有单元测试。

有没有办法将集成构建配置为仅运行签入的新单元测试。我需要为此创建自定义脚本吗?我似乎找不到开箱即用的方法。

或者是在没有 Teamcity 自动运行 tSQLt 单元测试的情况下签入的实用解决方案?因此,只需在 DEV 服务器上手动运行新的测试用例(签入后)?对此的扩展是每晚运行批处理以运行所有单元测试。

【问题讨论】:

    标签: sql-server unit-testing teamcity redgate tsqlt


    【解决方案1】:

    您不希望每次签入时都在构建服务器上运行所有测试的特殊原因吗?

    在我目前正在进行的项目中,我们有超过 1000 个 tSQLt 测试和另外 3000 个代码测试。每次签到时都会运行我们所有的测试。

    我不再使用 SQL 测试来编写我的 tSQLt 测试,因为我已将我的数据库单元测试集成到我的 Visual Studio 项目中。我有一个 T4 模板,它围绕我的 tSQLt 测试创建 NUnit 包装器,就我的构建服务器而言,它只是在运行 tSQLt 单元测试时运行一组常规 NUnit 测试。这意味着如果我愿意,我可以使用 NUnit 类别等来控制在构建服务器上运行哪些测试以及何时运行它们(即每次,仅在夜间构建期间)。

    有关我如何执行此操作的示例,请参阅 (https://github.com/chilli-andrew/)。这可能不适合您的工作流程,但值得一看以了解如何使用 tSQLt。

    【讨论】:

    • 感谢您的来信。运行 1000 多个 tSQLt 测试需要多长时间?我们预计会有大约 500 个单元测试,并且担心签入期间的额外构建时间(通过运行所有单元测试而不是仅运行新单元测试)。对于 4 名程序员,我们担心构建周期较长,以避免签入时可能出现的冲突/延迟,程序员可能会在构建当前运行时尝试签入(不确定这是否会导致延迟以外的问题)。我猜的另一个原因就是不要不必要地运行。
    • 构建和完整测试包在 CI 服务器上运行大约需要 40 分钟。大约有 4500 个单元测试、规范流测试和 tSQLt 测试。我们还将我们的数据库架构和对象存储在 Visual Studio 数据库项目中。这些需要一段时间来编译并将模式更改部署到测试数据库(可能占总时间的 50%)。 +-1000 tSQLt 测试在我的开发机器上自行运行只需要大约 5 分钟即可运行。
    【解决方案2】:

    您可以使用test classes 将您希望在每次签入时运行的任何“第 1 层”测试与您希望减少运行频率的其他测试分开,而不是每次只运行新测试。

    使用特定架构创建测试类。然后,您可以使用 SQL 比较/源代码控制过滤器来排除您不想在每次提交时进行测试的任何模式。

    这感觉比只运行新测试更安全。如果您只运行新测试,那么您不知道您的更改是否破坏了现有功能。

    更新: SQL CI 和 Team City 插件现在允许您指定要包含/排除的任何类,而不仅仅是运行 tSQLt.RunAll。

    【讨论】:

    • “如果 SQL CI 和 Team City 插件允许您指定您想要包含/排除的任何类,而不是仅仅运行 tSQLt.RunAll,那就更好了。” >>> 差不多就是这个意思。会很高兴。
    • 但这不会需要一些额外的步骤吗?假设我使用了“新”模式。然后使用 SQL Compare 仅提取此模式,然后仅使用“新”模式运行单元测试。但是在签入后,我是否不必更改 DEV 上的架构并在我的本地更改它,以便在下次签入时不会再次被拉/运行?不确定我们是否要添加这些额外的步骤。
    • 你是对的,仅仅运行新的测试是没有帮助的。由于上述帖子中的原因,我会避免只运行新测试。然而,它会让你运行所有测试的定义子集,比如那些你认为在每次提交时运行的重要测试。您可以有一个不同的 Team City 构建作业(比如每晚运行)来运行所有测试以实现完整覆盖。
    • 只是一个快速更新。 SQL CI 以及 TeamCity 和 TFS 插件现在允许您执行此操作。
    • 乔恩,感谢您的更新。问题:更新是否反映了您关于设置测试类和能够排除的评论?或者更新是否反映了我最初的问题,即是否可以将其设置为仅运行新的测试签入。我们在本地运行所有测试,并且我们有一个每晚运行所有测试的批处理。所以我们可以在签入期间不运行所有测试。在签入时只运行新测试的主要原因是避免长时间的签入/构建/运行所有测试步骤。
    【解决方案3】:

    我不确定您是如何为 CI 服务器创建 tsqlt 结果的,但如果您正在使用

    EXEC tSQLt.RunWithXmlResults 
    

    要生成您的测试输出,您可以尝试的另一个可能选项是。

    EXEC tSQLt.SetTestResultFormatter 'tsqlt.xmlresultformatter'
    EXEC tSQLt.Run 'UnitTests_YourUnitTestClass'
    EXEC tSQLt.SetTestResultFormatter 'tsqlt.defaultresultformatter'
    

    【讨论】:

    • 还有 tSQLt.RunTestClass ClassName。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2012-04-29
    • 2023-03-26
    相关资源
    最近更新 更多