在我们的iPhone应用程序单元测试中,我们有一个包含所有测试用例类的测试套件。在套件的setUp / tearDown中,我们进行常规设置/拆除,在DB中创建/删除一些实体。在setUp中,我们使用NSAsserts声明一切正常。 问题是,如果setUp出现问题,NSAssert会导致崩溃,并且没有调用tearDown,导致数据库未清除。
确保始终调用tearDown以确保数据库始终干净的最佳方法是什么?也许不使用NSAsserts?但那么如何告诉测试框架不运行测试用例?
感谢。
答案 0 :(得分:2)
我建议你在你的测试套件中添加一个布尔值的ivar,当一切设置正确时,它会在setUp中设置。然后将NSAssert替换为设置此变量,例如。由STAssert标记...如果出现任何问题,将导致您的测试失败。
在每个测试用例中,然后在执行检查之前检查此ivar是否为真,例如通过使用这样的东西:
-(void)setUp {
// Perform the setup of the testbed and setting testBedStable accordingly
STAssertTrue(testBedStable, @"Failed to setup test environment";
}
-(void)testSomething {
if(testBedStable) {
// Perform tests
}
else
STFail(@"Unable to perform test case");
}
此方法将确保始终调用tearDown,您可以相应地进行清理。
答案 1 :(得分:1)
是的,不要使用NSAssert。代替:
STFail
关于未成功设置的任何内容。-tearDown
中,检查实例变量以查看需要清理的内容。示例:
@interface DatabaseTest : SenTestCase
{
BOOL removeTestDataInTearDown;
}
- (void)addTestDataToDatabase
{
BOOL success;
// Attempt to add data to database. Set success according to results.
if (!success)
STFail(@"Unable to add test data to database", nil);
removeTestDataInTearDown = YES;
}
- (void)removeTestDataFromDatabase
{
// Remove data from database.
}
- (void)tearDown
{
if (removeTestDataInTearDown)
[self removeTestDataFromDatabase];
[super tearDown];
}
- (void)testSomething
{
[self addTestDataToDatabase];
// Execute test using data.
}
请注意,即使这样也有可能在数据库中留下残余,这使得此类测试变得脆弱。因此,您可以使用一组使用模拟对象代替实际数据库调用的测试来补充此类测试。