Unit testing XCTestCase的意外行为--创建不同的实例来运行测试方法
我使用XCTestCase编写单元测试用例,并在-setUp中初始化变量,如下所示:Unit testing XCTestCase的意外行为--创建不同的实例来运行测试方法,unit-testing,xunit,xctest,Unit Testing,Xunit,Xctest,我使用XCTestCase编写单元测试用例,并在-setUp中初始化变量,如下所示: -(无效)设置{ [超级设置]; //将设置代码放在这里。在调用类中的每个测试方法之前调用此方法。 静态调度一次; 一次发送(一次发送)^{ _myPath=@“路径”; }); } 但是当我尝试在测试用例中使用myPath时,它只在第一个用例中起作用,“myPath”在随后的用例中为零 所以我在设置中设置了断点,以查看发生了什么。我发现它为每个方法创建了新的实例 为了仔细检查,我创建了一个新项目和测试目标,
-(无效)设置{
[超级设置];
//将设置代码放在这里。在调用类中的每个测试方法之前调用此方法。
静态调度一次;
一次发送(一次发送)^{
_myPath=@“路径”;
});
}
但是当我尝试在测试用例中使用myPath时,它只在第一个用例中起作用,“myPath”在随后的用例中为零
所以我在设置中设置了断点,以查看发生了什么。我发现它为每个方法创建了新的实例
为了仔细检查,我创建了一个新项目和测试目标,以记录testcase地址,如下所示:
@实现测试
-(无效)设置
{
[超级设置];
//将设置代码放在这里。在调用类中的每个测试方法之前调用此方法。
NSLog(@“”,self);
}
-(无效)拆卸
{
//将拆卸代码放在这里。该方法在调用类中的每个测试方法后调用。
[超级撕裂];
}
-(无效)测试示例
{
XCTFail(@“没有实现\%s\”,\uu漂亮的函数\uuuu);
}
-(无效)测试示例2
{
XCTFail(@“没有实现\%s\”,\uu漂亮的函数\uuuu);
}
@结束
结果是:
fooTest[846:303] <fooTestTests: 0x1005ab750>
fooTest[846:303] <fooTestTests: 0x1005ab7f0>
fooTest[846:303]
足部[846:303]
由于XCTestCase被设计为具有一个或多个测试方法的对象,因此它不应该为每个方法创建不同的实例
在这种情况下,我不知道在哪里设置测试环境。即使在-init中编写安装代码,它仍然会创建新实例并多次调用-init。目前,我只有几个单元测试,但是当测试的数量增加,安装过程变得更加复杂时,这将是一个问题。谁能给我一个建议吗
添加问题摘要:
如果我在一个testcase类中有两个测试方法,那么行为将是:
-setUp
-拆卸
-init
或-dealoc
。而是使用-setUp
和-tearDown
,它们保证在每次测试之前和之后都会被调用。但每次测试都会对对象的一个全新实例进行操作。这有助于保持测试隔离
因此,要运行一个测试,就不要使用
调度\u once
,这是xUnit测试框架的常规模式,包括XTest:
-setUp
-拆卸
-init
或-dealoc
。而是使用-setUp
和-tearDown
,它们保证在每次测试之前和之后都会被调用。但每次测试都会对对象的一个全新实例进行操作。这有助于保持测试隔离
因此,请一次性摆脱
分派\u
,因此,如果我在一个testcase类中有两个测试方法,那么xUnit行为将是:1。将新testcase实例化为对象1和对象2-设置3。测试1 4-拆卸5。将新测试用例实例化为对象26-设置7。测试2 8-拆卸为什么需要步骤5?以确保测试不会相互影响。这是所有xUnit框架的标准。谢谢您的响应。我还发现了一些相关信息:我不认为XCTest会为每个测试创建一个新的测试类实例。如果我添加NSLog(@“测试用例:%p”,&self)对于每种测试方法,我都会得到相同的地址。然而,在每次调用setUp之前,似乎所有ivar都被设置为nil,所以我怀疑苹果正在做一些聪明的事情。作为补充说明,如果您在tearDown中没有显式地nil
IVAR,那么即使您在设置中给它一个新实例,它们也不会解除分配。因此,如果我在一个testcase类中有两个测试方法,xUnit行为将是:1。将新testcase实例化为对象1和对象2-设置3。测试1 4-拆卸5。将新测试用例实例化为对象26-设置7。测试2 8-拆卸为什么需要步骤5?以确保测试不会相互影响。这是所有xUnit框架的标准配置。感谢您的回复。我还发现了一些相关信息:我不认为XCTest会为每个测试创建一个新的测试类实例。如果我添加NSLog(@“测试用例:%p”,&self)对于每种测试方法,我都会得到相同的地址。然而,在每次调用setUp之前,似乎所有ivar都被设置为nil,所以我怀疑苹果正在做一些聪明的事情。作为补充说明,如果在拆卸过程中没有显式地nil
ivar,那么即使您在安装程序中给它一个新实例,它们也不会解除分配。