【问题标题】:How do you run one XCTestCase subclass's test method from inside another XCTestCase subclass's test method in XCode 7?如何在 XCode 7 中从另一个 XCTestCase 子类的测试方法中运行一个 XCTestCase 子类的测试方法?
【发布时间】:2016-08-06 13:03:12
【问题描述】:

如何在 XCode 7 中从另一个 XCTestCase 子类的测试方法中运行一个 XCTestCase 子类的测试方法?

我的销售点应用有一个测试套件。

我有一个名为“MathTest”的 XCTestCase 子类,它对应用程序的数学函数进行各种单元测试。它还有一个测试方法 testTillMath 来检查寄存器以查看交易总额是否都符合预期值。

然后我有另一个名为“TicketBuildingTest”的 XCTestCase 子类,它有一个名为 testCreateTickets 的测试方法,该方法从 Excel 电子表格数据源中提取,使用电子表格中的任何数据来组装特定批次的交易到特定于测试环境的特殊核心数据存储中。

testTillMath 方法只有在 testCreateTickets 首次成功运行时才会成功。

如何让 testTillMath 在每次 testCreateTickets 完成后运行?

我尝试从 TicketBuildingTest 内部 #include MathTest.m 以便我可以在 testCreateTickets 结束时调用 testTillMath,但 XCode 不允许我这样做。由于“重复符号_OBJC_CLASS_$_MathTest”,构建失败并出现错误“链接器命令失败,退出代码为1”

我意识到可能有不止一种方法可以给这只猫剥皮;在 PHPUnit 中,我可以指定一组测试方法以一定的顺序连续运行,在完成之前运行每个测试。我如何在 XCode 中做到这一点?

【问题讨论】:

  • 在我看来,测试应该尽可能地相互独立。除此之外,我认为这不可能开箱即用。也许您可以尝试创建一个通用超类并将通用测试放在那里。

标签: objective-c xcode unit-testing xcode7 xctest


【解决方案1】:

您故意引入了“测试污染”,即一项测试的成功或失败取决于另一项测试的成功或失败的情况。这是一个不好的做法。测试应该相互独立。这样你就知道当测试失败时,它是由于你的应用程序中专门测试的功能而失败的——所以你可以追踪该功能并修复它。调试测试污染是一个真正的考验,你应该不惜一切代价避免它。

一些测试框架(一个是Rspec;另一个是Cedar)随机化了测试的运行顺序,正是为了阻止您描述的那种测试耦合。

【讨论】:

  • 您的答案是正确的,因为我称它们为单元测试。单元测试绝对不应该相互依赖。话虽如此,事实证明,我并没有编写单元测试,但事实上,我正在编写end-to-end test。我们最终使用了一系列四个独立测试,其中后续测试依赖于之前的测试以特定方式(通过一系列模拟 UI 交互)设置数据库。这并不是说端到端测试比单元测试更好。我们也有这些。
  • 我能够通过按字母顺序排列方法名称来使端到端测试中的测试按顺序运行。但是在 XCode 8 中,它似乎随机化了测试执行的顺序。根据您对 Rspec 和 Cedar 的评价,我猜这是他们的意图。没关系,我们可以让我们的端到端测试适应一种巨大的测试方法。看到每个部分独立通过很有用,但我们可以在关键时刻放置 XCTFail 并产生相同的效果。
  • 很高兴您能够解决您的问题!不过,我对您在评论中所说的一件事提出异议:“一系列四个独立测试,其中后续测试依赖于先前的测试”。如果后续测试依赖于之前的测试,那么根据定义,它们不是独立的——这首先是造成你麻烦的原因。顺便说一句,我非常喜欢你的解决方案;我经常尝试将我的端到端测试整合到一个大型的所谓“旅程”测试中。
猜你喜欢
  • 2014-10-26
  • 2015-02-07
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多