XCTestCase的setUp方法的目的是什么?

时间:2014-01-10 07:24:12

标签: ios ios7 xctest

根据XCTestCase的{​​{1}}默认模板中的评论:

setUp

但是,在Put setup code here; it will be run once, before the first test case.中,XCTestCase.h上方的评论的说法不同:

setUp

为了确认实际行为,我在Setup method called before the invocation of each test method in the class.中设置NSLog来计算它被调用的次数:

setUp

这导致在每个测试方法之前调用static int count = 0; - (void)setUp { [super setUp]; count++; NSLog(@"Call Count = %d", count); } 方法(确认对setUp的评论)。

我想使用XCTestCase.h方法创建测试/模拟对象一次(例如,设置Core Data测试堆栈)。一遍又一遍地创建这些将是处理器密集型的,并且可能非常慢。

所以,

1)setUp实际上打算用于什么?当然开发人员不是一遍又一遍地在其中创建对象?

2)如何在setUp中仅一次创建这些对象?

2 个答案:

答案 0 :(得分:86)

这里有几点需要讨论:setUp方法的行为和一般最佳测试实践。

实际上有两个 setUp方法:

+ (void)setUp;
- (void)setUp;

类方法(+ (void)setUp)仅在整个测试运行期间运行一次。

实例方法(- (void)setUp)是默认模板中的方法;它在每次测试之前运行。希望在Xcode的假设未来版本中,此评论已更改为// Put setup code here. This method is called before the invocation of each test method in the class. WINK WINK

因此,通过这两种方法,您描述的两种行为都是可能的。

关于你的评论:

  

“当然开发人员不是一遍又一遍地在其中创建对象?”

我的答案是“是的,他们通常是”。 “良好”单元测试的流行首字母缩写是FIRST:

  • 快速
  • 隔离
  • 重复
  • 自动检验
  • 及时

隔离是此讨论的关键:您的测试不应该依赖于其他测试留下的任何先前状态。理想情况下,您应该为每次测试拆除并重新创建内存中的Core Data堆栈,这样您就知道自己是从一个干净的平板开始的。一个很好的例子是this post by Graham Lee。你想使用内存堆栈,因为a)你可以很容易地扔掉它,而b)它应该非常快,因为它只是在内存中而不是你的磁盘。

如果你发现你的测试运行缓慢(不要过早优化),那么我认为合理的下一步是在你的{{1方法,但每次都在+ (void)setUp方法中创建一个全新的上下文。

答案 1 :(得分:4)

我带着几乎相同的问题来到这里:如何在Swift 中执行setUp 一次。这是解决方案:

override class func setUp() {
    super.setUp()    
    // ...
}

override class func tearDown() {    
    // ...
    super.tearDown()
}

现在我仍然在寻找异步 setUp的解决方案!