【问题标题】:How can these sync methods be effectively unit tested?如何对这些同步方法进行有效的单元测试?
【发布时间】:2016-05-05 21:55:05
【问题描述】:

根据this question 的回答,我对以下两种同步方法的简单易用感到满意:

func synchronized(lock: AnyObject, closure: () -> Void) {
    objc_sync_enter(lock)
    closure()
    objc_sync_exit(lock)
}

func synchronized<T>(lock: AnyObject, closure: () -> T) -> T {
    objc_sync_enter(lock)
    defer { objc_sync_exit(lock) }
    return closure()
}

但为了确保他们确实在做我想做的事,我想将它们包装在成堆的单元测试中。我如何编写单元测试来有效地测试这些方法(并显示它们实际上正在同步代码)?

理想情况下,我还希望这些单元测试尽可能简单明了。据推测,这个测试应该是这样的代码,如果在同步块之外运行,将给出一组结果,但在这些同步块内给出一组完全独立的结果。

【问题讨论】:

  • 您是在尝试编写测试来测试同步块在一般情况下是否同步,还是在尝试测试依赖于同步块的代码是否正在同步?
  • @WillM.我对一般情况感兴趣。我想要一个单元测试来验证它是否正在同步通过它运行的任何代码。
  • 好的,我扔了一些东西来证明这一点。
  • 让我知道这是否是您的想法

标签: multithreading swift unit-testing synchronization


【解决方案1】:

这是一个可运行的 XCTest,用于验证同步。如果你同步delayedAddToArray,它会工作,否则会失败。

class DelayedArray:NSObject {
    func synchronized(lock: AnyObject, closure: () -> Void) {
        objc_sync_enter(lock)
        closure()
        objc_sync_exit(lock)
    }

    private var array = [String]()
    func delayedAddToArray(expectation:XCTestExpectation) {
        synchronized(self) {
            let arrayCount = self.array.count
            self.array.append("hi")
            sleep(5)
            XCTAssert(self.array.count == arrayCount + 1)
            expectation.fulfill()
        }
    }
}

func testExample() {
    let expectation = self.expectationWithDescription("desc")
    let expectation2 = self.expectationWithDescription("desc2")

    let delayedArray:DelayedArray = DelayedArray()
    // This is an example of a functional test case.
    let thread = NSThread(target: delayedArray, selector: "delayedAddToArray:", object: expectation)
    let secondThread = NSThread(target: delayedArray, selector: "delayedAddToArray:", object: expectation2)
    thread.start()
    sleep(1)
    secondThread.start()

    self.waitForExpectationsWithTimeout(15, handler: nil)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多