单位测试覆盖率低于预期

时间:2018-04-17 13:35:01

标签: swift unit-testing

我编写了一个基本的Utilities类,它有一个方法将json转换为数据。

static func data(from json: [String : AnyObject]) throws -> Data {
    do {
        return try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
    } catch let error {
        throw error
    }
}

之后我为这种方法写了一些测试。

func testJsonToDataSuccess() {
    let mockJson: [String : Any] = ["hello" : "there"]
    do {
        let data = try Utils.data(from: mockJson as [String : AnyObject])
        XCTAssertNotNil(data)
    } catch let error {
        XCTFail(error.localizedDescription)
    }
}

func testJsonToDataFail() {
    let someString = String(
        bytes: [0xD8, 0x00] as [UInt8],
        encoding: String.Encoding.utf16BigEndian)!

    let mockJson = ["hello" : someString]
    do {
        let data = try Utils.data(from: mockJson as [String : AnyObject])
        XCTAssertNil(data)
    } catch let error {
        XCTAssertNotNil(error)
    }
}

我认为我已经测试了这个Utilities类的成功和失败案例。但是,此课程的测试覆盖率为:%85。 我想知道为什么测试覆盖率不是%100? 任何帮助将不胜感激......

1 个答案:

答案 0 :(得分:0)

Pheew,你给了我一个关于这个的艰难时期,但我想在Xcode中了解代码覆盖率是值得的。一旦我运行了你的代码(由于你没有包含你曾经使用过什么项目设置的说明,也没有完成你的文件,因此它不是那么容易)我终于让它作为一个MacOs应用程序运行。

正如您所说,Utils类(或data函数)的覆盖范围最终不会完整。如果你看看那些没有被覆盖的线条,那么这些线条将是最后一个具有闭合括号的线条(至少那是它最终在我的情况下)。这似乎是Xcode的一些相当恼人的行为,但如果你查看this question这似乎是一个长期存在的问题,据我所知还没有解决。

奇怪的是,一旦你按照以下方式重写你的功能,这将会消失:

static func data(from json: [String : AnyObject]) throws -> Data {
    let data: Data
    do {
        data = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
    } catch let error {
        throw error
    }
    return data
}

最终的大括号不会受到这种行为的影响。

但是我授予你迄今为止我不得不忍受的最难的Swift代码的标题。