根据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
中仅一次创建这些对象?
答案 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
的解决方案!