Unit testing XCTestCase的意外行为--创建不同的实例来运行测试方法

Unit testing XCTestCase的意外行为--创建不同的实例来运行测试方法,unit-testing,xunit,xctest,Unit Testing,Xunit,Xctest,我使用XCTestCase编写单元测试用例,并在-setUp中初始化变量,如下所示: -(无效)设置{ [超级设置]; //将设置代码放在这里。在调用类中的每个测试方法之前调用此方法。 静态调度一次; 一次发送(一次发送)^{ _myPath=@“路径”; }); } 但是当我尝试在测试用例中使用myPath时,它只在第一个用例中起作用,“myPath”在随后的用例中为零 所以我在设置中设置了断点,以查看发生了什么。我发现它为每个方法创建了新的实例 为了仔细检查,我创建了一个新项目和测试目标,

我使用XCTestCase编写单元测试用例,并在-setUp中初始化变量,如下所示:

-(无效)设置{
[超级设置];
//将设置代码放在这里。在调用类中的每个测试方法之前调用此方法。
静态调度一次;
一次发送(一次发送)^{
_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类中有两个测试方法,那么行为将是:

  • 将新testcase实例化为对象1
  • -设置
  • 测试1
  • -拆卸
  • 将新测试用例实例化为对象2
  • -设置
  • 测试2
  • -拆卸
  • 为什么需要第五步

    答案

    答案是

    更多信息:


    要运行单个测试,这是xUnit测试框架的常规模式,包括XTest:

  • 实例化新的测试对象
  • 调用
    -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)nil
    IVAR,那么即使您在设置中给它一个新实例,它们也不会解除分配。因此,如果我在一个testcase类中有两个测试方法,xUnit行为将是:1。将新testcase实例化为对象1和对象2-设置3。测试1 4-拆卸5。将新测试用例实例化为对象26-设置7。测试2 8-拆卸为什么需要步骤5?以确保测试不会相互影响。这是所有xUnit框架的标准配置。感谢您的回复。我还发现了一些相关信息:我不认为XCTest会为每个测试创建一个新的测试类实例。如果我添加
    NSLog(@“测试用例:%p”,&self)nil
    ivar,那么即使您在安装程序中给它一个新实例,它们也不会解除分配。