2014-02-08 30 views
2

我编写单元测试用例XCTestCase,并初始化变量-setup如下:意外行为 - 创建不同的实例来运行测试方法

- (void)setUp { 
    [super setUp]; 
    // Put setup code here. This method is called before the invocation of each test method in the class. 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _myPath = @"Path"; 
    }); 
} 

但是当我尝试在测试情况下使用mypath中,它只在第一个中起作用,并且在随后的情况下“myPath”将是零。

所以我在-setUp中设置了断点以查看发生了什么。我发现它为每种方法创建新的实例!

要仔细检查它,我创建了一个新的项目和测试目标登录测试用例地址如下:

@implementation fooTestTests 
- (void)setUp 
{ 
    [super setUp]; 
    // Put setup code here. This method is called before the invocation of each test method in the class. 
    NSLog(@"<fooTestTests: %p>", self); 
} 

- (void)tearDown 
{ 
    // Put teardown code here. This method is called after the invocation of each test method in the class. 
    [super tearDown]; 
} 

- (void)testExample 
{ 
    XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 
} 

- (void)testExample2 
{ 
    XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 
} 
@end 

,其结果是:

fooTest[846:303] <fooTestTests: 0x1005ab750> 
fooTest[846:303] <fooTestTests: 0x1005ab7f0> 

由于XCTestCase被设计成一个对象有一个或多个测试方法,它不应该为每个方法创建不同的实例。

在这种情况下,我不知道在哪里设置我的测试环境。即使在-init中写入设置代码,它仍会多次创建新实例和调用-init。目前,我只有几个单元测试,但是当测试次数增加,并且设置过程变得更复杂时,这将是一个问题。任何人都可以给我一个建议吗?

添加问题总结:

如果我有一个测试用例类2种的测试方法,结果会是:

  1. 实例化新的测试用例为对象1
  2. -SETUP
  3. test 1
  4. -ararDown
  5. Instanitate new test情况下,物体2
  6. -SETUP
  7. 试验2
  8. -tearDown

为什么它需要步骤5?

答案

通过Jon Reid

更多信息给出了答案:Testcase class at XUnit Patterns

回答

3

要运行一个测试,这是xUnit的测试框架,包括XCTest的规律:

  1. 实例化新测试对象
  2. 调用-setUp
  3. 调用测试方法
  4. 调用-tearDown

这结束的单个测试。测试对象本身会在我们控制之外的某个时间后被销毁。

所以不要使用-init-dealloc与测试对象。而是使用-setUp-tearDown,它们保证在每次测试之前和之后调用。但是每个测试都会在对象的全新实例上运行。这有助于保持测试隔离。

所以摆脱你的dispatch_once

+0

所以,如果我在一个测试用例类2种的测试方法,所述的xUnit行为将是: 1.实例新的测试用例作为加工对象物1 2. -SETUP 3.试验1 4. -tearDown 5. Instanitate新testcase as object 2 6. -setUp 7. test 2 8. -tearDown 为什么需要第5步? –

+1

确保测试不会相互影响。它是所有xUnit框架的标准。 –

+0

感谢您的回复。 我还发现了一些关于这方面的信息:http://xunitpatterns.com/Testcase%20Class.html –

相关问题