gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:41:16 26 4
gpt4 key购买 nike

根据 XCTestCase 的默认模板中关于 setUp 的评论:

设置代码在这里;它将在第一个测试用例之前运行一次。

但是,在 XCTestCase.h 中,setUp 上面的注释表述不同:

在调用类中的每个测试方法之前调用的设置方法。

为了确认实际行为,我在setUp 中放置了一个NSLog 来计算它被调用了多少次:

static int count = 0;

- (void)setUp
{
[super setUp];
count++;

NSLog(@"Call Count = %d", count);
}

这导致在每个测试方法之前调用 setUp 方法(确认对 XCTestCase.h 的评论)。

我想使用 setUp 方法创建测试/模拟对象一次(例如,设置 Core Data 测试堆栈)。一遍又一遍地创建它们会占用大量处理器资源,而且速度可能会非常慢。

所以,

1) setUp 的实际用途是什么?开发人员肯定不会一遍又一遍地在其中创建对象吧?

2) 如何在 XCTestCase 中只创建这些对象一次

最佳答案

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

实际上有两个setUp方法:

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

类方法(+ (void)setUp)在整个测试运行过程中只运行一次。

实例方法(- (void)setUp)是默认模板中的方法;它在每次测试之前运行。希望在假设的 Xcode future 版本中,此注释将更改为 //Put setup code here。该方法在调用类中的每个测试方法之前被调用。 WINK WINK

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

关于您的评论:

"Surely developers aren't creating objects in it over and over?"

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

  • 隔离
  • 可重复
  • self 验证
  • 及时

Isolated 是本次讨论的关键:您的测试不应依赖于其他测试留下的任何先前状态。理想情况下,您应该为每个测试拆除并重新创建内存中的核心数据堆栈,这样您就知道您是从一个干净的平台开始的。一个很好的例子是 this post by Graham Lee .您想要使用内存中的堆栈,因为 a) 您可以轻松地将其丢弃,并且 b) 它应该非常快,因为它只是在内存中,不会占用您的磁盘。

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

关于ios - XCTestCase setUp 方法的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21038375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com