【发布时间】:2016-07-17 12:17:52
【问题描述】:
假设我们有一个状态可变的类:
class Machine {
var state = 0
}
现在,假设有一些控制状态的内部机制。但是,任何线程或队列都可能发生状态更改,因此必须在线程安全环境中执行对state 属性的读取和写入。为此,我们将在dispatch_queue_t 上使用简单的sync(:_) 方法来同步对state 变量的访问。 (不是唯一的方法,但这是一个例子)
现在,我们可以创建一个保存状态值的私有变量和另一个使用 dispatch_sync(_:) 方法的自定义 setter 和 getter 的公共变量。
class Machine {
private var internalState = 0
var state: Int {
get {
var value: Int?
dispatch_sync(dispatch_get_main_queue()) {
value = self.internalState
}
return value!
}
set(newState) {
dispatch_sync(dispatch_get_main_queue()) {
self.internalState = newState
}
}
}
}
state 现在可以从任何队列或线程安全同步访问 - 它是线程安全的。
现在问题来了。
如何使用XCTest 测试这种行为?
由于Machine 类可以有一个复杂的状态机,我们需要测试它在任何环境中的执行情况:
- 测试从任何队列或线程对
state的访问 - 测试从任何队列或线程写入
state
成功测试这种行为的最佳方法是什么?
目前,我正在创建自定义调度队列数组和已定义状态数组。然后我使用dispatch_async 方法来改变状态并测试它的值。这引入了XCTest 执行的新问题,因为我需要跟踪所有状态突变何时完成。该解决方案似乎相当复杂且不可维护。
我可以做哪些不同的事情来实现更好的测试?
【问题讨论】:
-
stackoverflow.com/users/4590961/said-sikira 正在做类似的事情 - 您是否设法找到解决方案?
标签: swift multithreading thread-safety xctest