XCTestCase简单介绍和使用

为什么我们需要测试?

    测试用例使我们的代码质量变得可靠,同时让我们能够放心地重构或者修改代码,并保证我们的修改没有破坏其他部分。而且我们可以在项目开始的第一天就能运行我们的代码,而不用等到万事俱备。

XCTestCase

   XCTest作为我们的测试框架是因为它非常简单并且与 Xcode的IDE直接集成。

   每个XCode创建iOS的工程中都有一个叫做”工程名Tests”的分组,这个分组里就是XCTestCase的子类,XCTest中的测试类都是继承自XCTestCase。 

   例如新建一个工程,命名为Demo,就能看到如图 

152457_KKYM_2326662.png

#import <UIKit/UIKit.h>#import <XCTest/XCTest.h>@interface DemoTests : XCTestCase@end@implementation DemoTests

- (void)setUp {
    [super setUp];    // Put setup code here. This method is called before the invocation of each test method in the class.}

- (void)tearDown {    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {    // This is an example of a functional test case.
    XCTAssert(YES, @"Pass");
}

- (void)testPerformanceExample {    // This is an example of a performance test case.
    [self measureBlock:^{        // Put the code you want to measure the time of here.
    }];
}@end

 四个方法分别是:setUp, tearDown, testExample, testPerformanceExample。其中testExample方法左侧有一个播放按钮,点击它就会对这个方法进行测试,而在整个文件的@implemenation那行也有个同样的按钮,点击后会对当前测试用例的所有方法进行测试,也可通过Command+U快捷键来触发。这个测试用例类没有头文件,因为测试用例不需要给外部暴漏接口。按照苹果官方的文档,建立一个测试用例的过程应该是这样的:

  • 建立一个XCTestCase的子类

  • 实现测试方法

  • 选择性的定义一些实例变量来存储fixture的状态

  • 通过重写setUp方法选择性的实例化fixture

  • 通过重写tearDown方法来在测试后清除

  • 测试方法没有参数和返回值,用test作为前缀,比如: - (void)test+name

XCTFail(format…) 生成一个失败的测试;
XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;
XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;
XCTAssert(expression, format...)当expression求值为TRUE时通过; 
XCTAssertTrue(expression, format...)当expression求值为TRUE时通过; 
XCTAssertFalse(expression, format...)当expression求值为False时通过;
XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;
XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过;
XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以);
XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;
XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态) XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;
XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
特别注意下XCTAssertEqualObjects和XCTAssertEqual。
XCTAssertEqualObjects(a1, a2, format...)的判断条件是[a1 isEqual:a2]是否返回一个YES。
XCTAssertEqual(a1, a2, format...)的判断条件是a1 == a2是否返回一个YES。
对于后者,如果a1和a2都是基本数据类型变量,那么只有a1 == a2才会返回YES




转载于:https://my.oschina.net/u/2326662/blog/549963

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JsonSerialize 是提供安全的方法来编码和解码 Swift 对象为 JSON。 示例: class TestSubStruct: ToJson, FromJson {     let foo = "bar"     init(foo: String) {         self.foo = foo     }     func toJson() -> Json {         return Json.Object(["foo": foo.toJson()])     }     class func fromJson(json: Json) -> TestSubStruct? {         let decoder = JsonDecoder(json: json)         if let value: String = decoder.readValue("foo") {             return TestSubStruct(foo: value)         }         return nil     }}class TestStruct: ToJson, FromJson {     let int    = 123     let float  = 123.0     let string = "foo"     let bool   = true     let array  = ["foo"]     var dict   = ["foo": "bar"]     var sub    = TestSubStruct(foo: "bar")     init() {}     init(json: Json) {         let decoder = JsonDecoder(json: json)         int    = decoder.readValue("int")!         float  = decoder.readValue("float")!         string = decoder.readValue("string")!         bool   = decoder.readValue("bool")!         array  = decoder.readArray("array")!         dict   = decoder.readDictionary("dict")!         sub    = decoder.readValue("sub")!     }     func toJson() -> Json {         let json = [             "int":    int.toJson(),             "float":  float.toJson(),             "string": string.toJson(),             "bool":   bool.toJson(),             "array":  Json.fromArray(array),             "dict":   Json.fromDictionary(dict),             "sub":    sub.toJson(),             "null":   Json.Null             ]         return Json.Object(json)     }     class func fromJson(value: Json) -> TestStruct? {         return value.object ? TestStruct(json: value) : nil     }}class JsonSerializeTests: XCTestCase {     func testJsonEncode() {         let testObject = TestStruct()         let expected = "{\"int\":123.0,\"bool\":true,\"null\":null,"          "\"array\":[\"foo\"],\"dict\":{\"foo\":\"bar\"},"          "\"float\":123.0,\"string\":\"foo\",\"sub\":{\"foo\":\"bar\"}}"         let encoded = testObject.toJson().toString()         XCTAssert(encoded == expected, "Invalid JSON: \(encoded)")     }     func testJsonEncodeOptional() {         var test: Int?         XCTAssert(Json.fromOptional(test).toString() == "null", "Should be Null")         test = 10         XCTAssert(Json.fromOptional(test).toString() == "10.0", "Should be 10.0")     }     func testJsonDecode() {         let jsonString = "{\"int\":321.0,\"bool\":false,"          "\"array\":[\"bar\"],\"dict\":{\"bar\":\"baz\"},"          "\"float\":321.0,\"string\":\"bar\",\"sub\":{\"foo\":\"bar\"}}"         let decoder = JsonDecoder(jsonString: jsonString)         let decoded = TestStruct(json: decoder.json)         XCTAssert(decoded.int == 321, "Invalid int value")         XCTAssert(decoded.bool == false, "Invalid bool value")         XCTAssert(decoded.array == ["bar"], "Invalid array value")         XCTAssert(decoded.dict == ["bar": "baz"], "Invalid dic value")         XCTAssert(decoded.float == 321.0, "Invalid float value")         XCTAssert(decoded.string == "bar", "Invalid string value")         XCTAssert(decoded.sub.foo == "bar", "Invalid sub value")     }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值