【问题标题】:While running the go test under a package, how to skip a go file at test as well as at coverage report在包下运行 go 测试时,如何在测试和覆盖报告中跳过 go 文件
【发布时间】:2018-04-02 04:52:33
【问题描述】:

我想跳过包下的特定 go 文件,同时运行 go 测试 和覆盖。 请找到以下命令,我曾经在我的服务包下运行:

cd src/service && go test --coverprofile coverageService.out --coverpkg ./.

【问题讨论】:

    标签: unit-testing testing go


    【解决方案1】:

    不幸的是,没有简单的方法可以仅根据文件名跳过测试,但是,以下三个简单的选项可能会起作用:

    1.使用正则表达式指定测试

    go test 命令支持-run 运行时选项,它只运行满足正则表达式的测试:

    -运行正则表达式

    只运行那些匹配正则表达式的测试和示例。 对于测试,正则表达式由不带括号的斜杠 (/) 分隔 字符转换成一系列正则表达式,每个部分 一个测试的标识符必须匹配相应的元素 序列,如果有的话。请注意,匹配的可能父母是 也运行,以便 -run=X/Y 匹配并运行并报告结果 在所有匹配 X 的测试中,即使那些没有匹配 Y 的子测试, 因为它必须运行它们来查找那些子测试。

    为了使其正常工作,您需要以可以通过正则表达式排除它们的方式命名相关文件中的所有测试(例如,使所有测试以 TestExcludable... 开头,例如TestExcludableATestExludableB等)。然后使用一个有点 hacky 的负正则表达式运行,例如-run "Test[^E][^x][^c][^l][^u][^d][^a][^b][^l][^e].*"

    2。不要使用构建标志编译某些测试

    正如this stackoverflow post 中详细说明的那样,您可以使用构建标志来阻止特定文件构建为测试套件的一部分。简而言之,

    skip_test.go

    // +build !skipset1
    package name
    
    import testing
    
    // Rest of test file
    

    然后,当您调用go test 时,我们会使用-tags 参数并指定您想跳过的测试,例如-tags skipset1

    3.在构建期间重命名有问题的文件

    按照 go test 文档中的说明,

    名称以“_”(包括“_test.go”)或“.”开头的文件被忽略。

    只需用重命名包围您的 go test 命令,以便跳过的文件实际上不会编译到测试可执行文件中:

    mv src/skip_test.go src/_skip_test.go && go test ... || mv src/_skip_test.go src/skip_test.go

    (注意使用 || 并在第二步中,即使 go 测试失败也使其运行)。

    【讨论】:

    • 感谢@jwriteclub 的建议我可以跳过测试用例,但在运行-coverprofile 时我无法排除skipset1 文件中存在的那些方法
    • 我不确定我是否理解,您希望覆盖工具不覆盖跳过的测试调用的代码?
    • 是的,该工具应涵盖包下存在的所有文件,但标记为跳过测试的文件除外
    • 那么我认为您需要使用构建标志。如果有问题的代码没有构建,那么它就不会被覆盖。
    猜你喜欢
    • 2020-02-21
    • 2018-11-05
    • 2019-05-13
    • 1970-01-01
    • 2012-02-15
    • 2014-07-06
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多