iOS测试:有没有办法跳过测试?

时间:2015-05-27 09:13:31

标签: ios swift xctest

如果当前禁用该功能,我不想执行某些测试。有没有办法“跳过”测试(并在控制台上获得适当的反馈)?

这样的事情:

func testSomething() {
  if !isEnabled(feature: Feature) {
    skip("Test skipped, feature \(feature.name) is currently disabled.")
  }

  // actual test code with assertions here, but not run if skip above called.
}

12 个答案:

答案 0 :(得分:30)

您可以通过右键单击左侧编辑器托盘中的测试符号来禁用Xcode运行的XCTests。

enter image description here

您将获得此菜单,您可以选择“禁用”选项。

enter image description here

再次右键单击将允许您重新启用。此外,如user @ sethf的回答所述,您将在.xcscheme文件中看到当前已停用测试的条目。

作为最后一点,我建议不要禁用测试并在xcscheme中提交禁用代码。测试意味着失败,而不是沉默,因为它们不方便。

答案 1 :(得分:9)

从Xcode 11.4开始,您将可以使用XCTSkipUnless(_:_:file:line:)

release notes阅读,

XCTest现在支持基于运行时动态跳过测试 条件,例如仅在特定环境下运行时才执行某些测试 设备类型或可访问远程服务器时。当测试是 跳过,Xcode在测试导航器和测试中以不同的方式显示它 报告并突出显示跳过发生的代码行 带有可选的用户描述。有关跳过的测试的信息是 还包含在.xcresult中以进行程序访问。

要跳过测试,请从以下位置调用新的XCTSkip *函数之一: 测试方法或setUp()。例如:

func test_canAuthenticate() throws {
    XCTSkipIf(AuthManager.canAccessServer == false, "Can't access server")

    // Perform test… 
}

XCTSkipUnless(:file:line :) API与 XCTSkipIf(:file:line :)但如果提供的表达式为 使用false代替true,并且可以使用XCTSkip API跳过 无条件的。 (13696693)

答案 2 :(得分:8)

我在一篇文章中找到的另一种可能的解决方案:在跳过的测试前加上类似&#34的内容;跳过_"

优点:

  • XCode不会将它们视为测试
  • 您可以使用搜索
  • 轻松找到它们
  • 您可以再次进行测试,替换"跳过_"到""

答案 3 :(得分:4)

通过修改我的ui测试.xcscheme文件并在TestableReference下添加一个名为SkippedTests的部分,然后使用' Identifier'添加单个Test标签,我找到了一种方法。属性与您的类和测试方法的名称。类似的东西:

from collections import Counter    
counter = Counter(mystr.lower())

希望这有帮助

答案 4 :(得分:1)

不幸的是,没有内置测试用例跳过。测试用例通过或失败。

这意味着您必须自己添加该功能 - 您可以通过将信息打印到控制台的类别向XCTestCase添加功能(例如XCTestCase.skip)。但是,您必须在此之后放置return以防止其他断言运行。

答案 5 :(得分:1)

没有测试用例跳过。您可以使用if-else块:嵌套并运行/打印您想要的输出。

答案 6 :(得分:1)

现在可以使用xcode 8.在另一个问题中查看我的帖子:

Running individual XCTest (UI, Unit) test cases for iOS apps from the command line

答案 7 :(得分:1)

这就是测试方案的目的。 您可以针对不同的测试情况或需求制定不同的方案。 例如,您可能想要创建一个运行所有测试的方案(完整回归方案),或者您可能希望选择少数几个以在进行小的更改时对应用程序进行快速冒烟测试。 这样,您可以根据需要执行的测试选择不同的方案。 只需转到

Product >> Scheme

答案 8 :(得分:1)

从Xcode 11.4+开始,您可以使用XCTSkipIf()XCTSkipUnless()

try XCTSkipIf(skip condition, "message")


try XCTSkipUnless(non-skip condition, "message")

https://developer.apple.com/documentation/xctest/methods_for_skipping_tests#overview

答案 9 :(得分:1)

如果使用Xcode 11和TestPlan,则可以调整配置以跳过或允许特定测试。 Xcode TestPlan毕竟是JSON格式。

默认情况下,所有测试均已启用,您可以跳过测试列表或测试文件。

"testTargets" : [
    {
        "skippedTests" : [
            "SkippedFileTests", // skip the whole file
            "FileTests\/testSkipped()" // skip one test in a file
        ]
    ...

相反,默认情况下,您也可以跳过所有测试,只启用其中的几个。

"testTargets" : [
    {
        "selectedTests" : [
            "AllowedFileTests", // enable the whole file
            "FileTests\/testAllowed()" // enable only a test in a file
        ]
    ...

我不确定是否可以同时使用这两种配置。它根据Automatically includes new tests翻转逻辑。

答案 10 :(得分:0)

由于缺少内置测试用例跳过,cmd-/ Comment Selection命令具有一些可搜索的模式,如 :TEST:SKIP: reason ,可以简单实用。将有意义的消息打印到控制台。

func testSomeFeature() {
    print(":TEST:SKIP: testSomeFeature disabled pending ...") 
//    ... skipped selection ..
}

稍后,更新someFeature并同时取消注释someFeatureTest

使用某些搜索模式(如:SKIP:)可以允许在源代码和控制台输出中找到所有跳过的功能和测试。

注意:cmd-/'//'样式注释会在Re-Indent命令后保留代码缩进。由于不保留代码缩进,/ * ... * / style注释可能会失去一些可读性。

答案 11 :(得分:0)

这不是通用的,但是您可以在XCTestCase中覆盖invokeTest并避免在必要时调用super。我不确定控制台中是否有适当的反馈。

例如,以下片段使测试仅在带有iPhone 7 Plus / iPad Pro 9.7“ / iOS 11.4的iOS模拟器上运行:

class XXXTests : XCTestCase {

    let supportedModelsAndRuntimeVersions: [(String, String)] = [
        ("iPhone9,2", "11.4"),
        ("iPad6,4", "11.4")
    ]

    override func invokeTest() {
        let environment = ProcessInfo().environment
        guard let model = environment["SIMULATOR_MODEL_IDENTIFIER"], let version = environment["SIMULATOR_RUNTIME_VERSION"] else {
            return
        }
        guard supportedModelsAndRuntimeVersions.contains(where: { $0 == (model, version) }) else {
            return
        }
        super.invokeTest()
    }