gpt4 book ai didi

objective-c - 测试多线程

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:22 25 4
gpt4 key购买 nike

当我将应用程序从单线程转移到多线程时,我试图确保我的 ObjC 多线程实现是正确的。

现在我设置了单元测试以确保在单线程环境中一切正常。

我该怎么做才能确保这在多线程中成立?我想继续使用单元测试,但不确定如何在单元测试中测试多线程。

澄清:我正在使用 NSBlockOperation/NSOperationQueue 实现多线程。

最佳答案

要测试这样的东西,您需要在测试中控制 NSOperationQueue

假设您正在测试的类名为 MySubject。首先,您需要重构它,以便我们可以注入(inject) NSOperationQueue——这将允许使用替换它进行测试。因此,去掉所有出现的 [NSOperationQueue mainQueue] 并将它们替换为类变量。从 MySubject 的构造函数中的参数初始化该类变量。因此,您必须更改 MySubject 的所有实例以传递 [NSOperationQueue mainQueue]

@interface MySubject: NSObject {
NSOperationQueue* operationQueue;
}
@end

@implementation MySubject
-(MySubject*)initWithOperationQueue:(NSOperationQueue*)queue {
if ( self = [super init] ) {
self.operationQueue = [queue retain];
}
return self;
}

-(void)dealloc {
[operationQueue release];
}

-(void)startOperations {
[operationQueue addOperation:...];
[operationQueue addOperation:...];
}
@end

现在客户看起来像这样:

subject = [[MySubject alloc] initWithOperationQueue:[NSOperationQueue mainQueue]];
[subject startOperations];

现在对于测试,您可以创建一个简单的测试队列...它需要实现您的主题使用的任何方法。

@interface MyTestOperationQueue: NSMutableArray {
}
@end

@implementation MySubject

-(void)addOperation:(NSOperation*)operation {
[self addObject:operation];
}
@end

现在你的测试看起来像这样:

testQueue = [[MyTestOperationQueue alloc] init];
subject = [[MySubject alloc] initWithOperationQueue:testQueue];
[subject startOperations];

// You may want to have other tests that execute the queue operations
// in a different order
[[testQueue objectAtIndex:0] start];
[[testQueue objectAtIndex:0] waitUntilFinished];
[[testQueue objectAtIndex:1] start];
[[testQueue objectAtIndex:1] waitUntilFinished];

// Verify results

当然,这种测试无法验证并发操作是否可以安全地同时执行,但这可以涵盖很多您在尝试设计类时会感兴趣的情况.

关于objective-c - 测试多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6851629/

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