Ò»¡¢µ¥Ôª²âÊԵ͍Òå
ÔÚ¼ÆËã»ú±à³ÌÖУ¬µ¥Ôª²âÊÔ£¨Ó¢ÓUnit Testing£©ÓÖ³ÆÎªÄ£¿é²âÊÔ,
ÊÇÕë¶Ô³ÌÐòÄ£¿é£¨Èí¼þÉè¼ÆµÄ×îСµ¥Î»£©À´½øÐÐÕýÈ·ÐÔ¼ìÑéµÄ²âÊÔ¹¤×÷¡£³ÌÐòµ¥ÔªÊÇÓ¦ÓõÄ×îС¿É²âÊÔ²¿¼þ¡£
ÔÚ¹ý³Ì»¯±à³ÌÖУ¬Ò»¸öµ¥Ôª¾ÍÊǵ¥¸ö³ÌÐò¡¢º¯Êý¡¢¹ý³ÌµÈ£»¶ÔÓÚÃæÏò¶ÔÏó±à³Ì£¬×îСµ¥Ôª¾ÍÊÇ·½·¨£¬°üÀ¨»ùÀࣨ³¬Àࣩ¡¢³éÏóÀà¡¢»òÕßÅÉÉúÀࣨ×ÓÀࣩÖеķ½·¨¡£
¸ù¾Ý²»Í¬³¡¾°£¬µ¥ÔªµÄ¶¨ÒåÒ²²»Ò»Ñù£¬Í¨³£ÎÒÃǽ«CÓïÑԵĵ¥¸öº¯Êý»òÕßÃæÏò¶ÔÏóÓïÑԵĵ¥¸öÀàÊÓ×÷²âÊԵĵ¥Ôª¡£ÔÚʹÓõ¥Ôª²âÊԵĹý³ÌÖУ¬ÎÒÃÇÒªÖªµÀÕâÒ»µã£º
µ¥Ôª²âÊÔ²¢²»ÊÇΪÁËÖ¤Ã÷´úÂëµÄÕýÈ·ÐÔ£¬ËüÖ»ÊÇÒ»ÖÖÓÃÀ´°ïÖúÎÒÃÇ·¢ÏÖ´íÎóµÄÊÖ¶Î
µ¥Ôª²âÊÔ²»ÊÇÍòÄÜÒ©£¬ËüȷʵÄܰïÖúÎÒÃÇÕÒµ½´ó²¿·Ö´úÂëÂß¼ÉϵÄbug£¬Í¬Ê±£¬ÎªÁËÌá¸ß²âÊÔ¸²¸ÇÂÊ£¬ÕâÄÜ±ÆÆÈÎÒÃǶԴúÂë²»¶Ï½øÐÐÖØ¹¹£¬Ìá¸ß´úÂëÖÊÁ¿µÈ¡£
¶þ¡¢iOSµ¥Ôª²âÊÔ
xcode±¾ÉíµÄ²âÊÔ¿ò¼Ü¼¯³É£ºÔÚXcode4.xÖм¯³ÉÁ˲âÊÔ¿ò¼ÜOCUnit£¬UI TestsÊÇiOS9ÍÆ³öµÄÐÂÌØÐÔ¡£Ä¿Ç°ÎÒÃÇÔÚ´´½¨ÏîÄ¿µÄʱºò»áĬÈÏÑ¡ÖÐÓйزâÊÔµÄÕâÁ½ÏInclude
Unit Tests¡¢Include UI Tests¡£ÔÚ´´½¨ÏîĿ֮ºó£¬»á×Ô¶¯Éú³ÉÒ»¸öappName+TestsµÄÎļþ¼ÐĿ¼£¬ÏÂÃæ´æ·Å×ŵ¥Ôª²âÊÔµÄÎļþ¡£
¸ù¾Ý²âÊÔµÄÄ¿µÄ´óÖ¿ÉÒÔ½«µ¥Ôª²âÊÔ·ÖΪÕâÈýÀࣺ
a.ÐÔÄܲâÊÔ£º²âÊÔ´úÂëÖ´Ðл¨·ÑµÄʱ¼ä
b.Âß¼²âÊÔ£º²âÊÔ´úÂëÖ´Ðнá¹ûÊÇ·ñ·ûºÏÔ¤ÆÚ
c.Òì²½²âÊÔ£º²âÊÔ¶àÏ̲߳Ù×÷´úÂë
UnitTestÎļþÀïÃæ·½·¨½éÉÜ£º
1.(void)setUp {//ÿһ¸ö²âÊÔÓÃÀý¿ªÊ¼Ç°µ÷Óã¬ÓÃÀ´³õʼ»¯Ïà¹ØÊý¾Ý
[super
setUp];
// Put setup code here.
This method is called
before the
invocation of each
test method in the class.
} |
2.(void)tearDown {//²âÊÔÓÃÀýÍê³Éºóµ÷Ó㬿ÉÒÔÓÃÀ´ÊͷűäÁ¿µÈ½áβ²Ù×÷
//
Put teardown code here. This
method is called
after the invocation
of each test method
in the class.
[super tearDown];
} |
3.(void)testExample {//ÓÃÀ´Ö´ÐÐÎÒÃÇÐèÒªµÄ²âÊÔ²Ù×÷,Õý³£Çé¿öÏ£¬ÎÒÃDz»Ê¹ÓÃÕâ¸ö·½·¨£¬¶øÊÇ´´½¨ÃûΪtest+²âÊÔÄ¿µÄµÄ·½·¨À´Íê³ÉÎÒÃÇÐèÒªµÄ²Ù×÷(×¢Ò⣺´Ëʱ×Ô¶¨ÒåµÄ·½·¨ÐèÒªÒÔtest¿ªÍ··½ÄܽøÐвâÊÔ£¬·ñÔò×ó±ßÊDz»ÏÔʾÁâÐεÄ)
//
This is an example of a
functional test
case.
// Use XCTAssert and related
functions to verify
your tests
produce the correct
results.
} |
4.(void)testPerformanceExample {//»á½«·½·¨ÖеÄblock´úÂëºÄ·Ñʱ³¤´òÓ¡³öÀ´--ĬÈÏÖ´ÐÐÁË10´Î£¬´òÓ¡³öÁËÆ½¾ùºÄʱ£¬ºÍ¸÷´ÎµÄºÄʱ£¬×î´óÎó²î²»³¬¹ý10%¡£ÆäÖÐÔËÐÐÖ®ºóblockÕâÐÐÓÒ²àÏÔʾµÄ¾ÍÊÇÆ½¾ùºÄʱ¡£
[self
measureBlock:^{
// Put the code you want
to measure the time of here.
}];
} |
ÔÚÿ¸ö²âÊÔÓÃÀý·½·¨µÄ×ó²àÓиöÁâÐεıê¼Ç£¬µã»÷Õâ¸ö±ê¼Ç¿ÉÒÔµ¥¶ÀµÄÔËÐÐÕâ¸ö²âÊÔ·½·¨¡£Èç¹û²âÊÔͨ¹ýûÓз¢ÉúÈκζÏÑÔ´íÎó£¬ÄÇôÕâ¸öÁâÐξͻá±ä³ÉÂÌÉ«¹´Ñ¡×´Ì¬¡£Ê¹Óÿì½Ý¼ücommand+UÖ±½ÓÒÀ´Îµ÷ÓÃËùÓеĵ¥Ôª²âÊÔ¡£
ÁíÍ⣬¿ÉÒÔÔÚ×ó²àµÄÎļþÀ¸ÖÐÑ¡Öе¥Ôª²âÊÔÀ¸Ä¿£¬È»ºóÖ±¹ÛµÄ¿´µ½ËùÓвâÊԵĽá¹û¡£Í¬ÑùµÄµã»÷ÓÒ²àÁâÐÎλÖõİ´Å¥¿ÉÒÔÔËÐе¥¸ö²âÊÔ·½·¨»òÕßÎļþ£º

ΪÁ˱£Ö¤µ¥Ôª²âÊÔµÄÕýÈ·ÐÔ£¬ÎÒÃÇÓ¦µ±±£Ö¤²âÊÔÓÃÀýÖÐÖ»´æÔÚÒ»¸öÀà»òÕßÖ»·¢ÉúÒ»¸öÀà±äÁ¿µÄÊôÐÔÐ޸ġ£ÏÂÃæÊÇÎÒÃDzâÊÔÖг£Óõĺ궨Ò壺£¨XCTest
´øÓÐÐí¶àÄÚ½¨µÄ¶ÏÑÔ£©
XCTAssertNotNil(a1, format¡) µ±a1²»Îªnilʱ³ÉÁ¢
XCTAssert(expression, format...) µ±expression½á¹ûΪYES³ÉÁ¢
XCTAssertTrue(expression, format...) µ±expression½á¹ûΪYES³ÉÁ¢£»
XCTAssertEqualObjects(a1, a2, format...) ÅжÏÏàµÈ£¬µ±[a1
isEqualTo: a2]·µ»ØYESµÄʱºò³ÉÁ¢
XCTAssertEqual(a1, a2, format...) µ±a1==a2·µ»ØYESʱ³ÉÁ¢
XCTAssertNotEqual(a1, a2, format...) µ±a1!=a2·µ»ØYESʱ³ÉÁ¢
&&
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ÓïÑÔ±êÁ¿¡¢½á¹¹Ìå»òÁªºÏÌåʱʹÓÃ,
ÅжϵÄÊDZäÁ¿µÄµØÖ·£¬Èç¹ûµØÖ·ÏàͬÔò·µ»ØTRUE£¬·ñÔò·µ»ØNO£©£»
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ûÓз¢Éú¾ßÌåÒì³£¡¢¾ßÌåÒì³£Ãû³ÆµÄÒ쳣ʱͨ¹ý²âÊÔ£¬·´Ö®²»Í¨¹ý
Èý¡¢²âÊÔ
1¡¢Âß¼²âÊÔ£ºÂß¼²âÊÔµÄÄ¿µÄÊÇΪÁ˼ì²âÔÚ´úÂëÖ´ÐÐǰºó·¢ÉúµÄ±ä»¯ÊÇ·ñ·ûºÏÔ¤ÆÚ
e.g:
@interface TestModel1 : NSObject
@property (nonatomic, copy)
NSString name;
@property (nonatomic, strong)
NSNumber age;
@property (nonatomic, assign)
NSUInteger flags;
(instancetype)modelWithName:
(NSString )name age: (NSNumber )
age flags: (NSUInteger)flags;
(instancetype)initWithDictionary:
(NSDictionary *)dict;
(NSDictionary *)modelToDictionary;
@end
@implementation TestModel1
(instancetype)modelWithName:
(NSString )name age:(NSNumber
)age flags:(NSUInteger)flags
{
TestModel1 *model = [[self alloc] init];
model.name = name;
model.age = age;
model.flags = flags;
return model;
}
(instancetype)initWithDictionary:
(NSDictionary *)dict
{
self.name = dict[@"name"];
self.age = dict[@"age"];
self.flags = [dict[@"flags"]
integerValue];
return self;
}
(NSDictionary *)modelToDictionary
{
return @{@"name":self.name,@"age":
self.age,@"flags":[NSNumber
numberWithInteger:self.flags]};
}
@end |
È»ºóÔÚ²âÊÔÎļþÀïÃæ£º
(void)testModelConvert
{
NSString json = @"{\"name\":
\"SindriLin\",\"age\"
:22,\"flags\":987654321}";
NSMutableDictionary dict =
[[NSJSONSerialization
JSONObjec
tWithData: [json
dataUsingEncoding:
NSUTF8StringEncoding]
options:
kNilOptions error:
nil] mutableCopy];
TestModel1 model = [[TestModel1
alloc] initWithDictionary:
dict];
XCTAssertNotNil(model);
XCTAssertTrue([model.name
isEqualToString:
@"SindriLin"]);
XCTAssertTrue([model.age isEqual:
@(22)]);
XCTAssertEqual(model.flags, 987654321);
XCTAssertTrue([model isKindOfClass:
[TestModel1 class]]);
model = [TestModel1 modelWithName:
@"Tessie"
age: dict[@"age"] flags:
562525];
XCTAssertNotNil(model);
XCTAssertTrue([model.name isEqual
ToString: @"Tessie"]);
XCTAssertTrue([model.age isEqual: dict[@"age"]]);
XCTAssertEqual(model.flags, 562525);
NSDictionary modelJSON = [model
modelToDictionary];
XCTAssertTrue([modelJSON isEqual:
dict] == NO);
dict[@"name"] = @"Tessie";
dict[@"flags"] = @(562525);
XCTAssertTrue([modelJSON isEqual:
dict]);
} |
2¡¢ÐÔÄܲâÊÔ£º
ÔÚÆ½³£µÄ¹¤×÷ÖУ¬ÎÒÃÇ»¹¿ÉÒÔͨ¹ý£º instrument(xcode
-> product->profile)¹¤¾ßºÜºÃµÄ²éÕÒµ½ÏîÄ¿ÖеĴúÂëºÄʱµã£¬£¨ºóÃæ½éÉÜ£©¡£ÏȽéÉܵ¥Ôª²âÊÔµÄÐÔÄܲâÊÔ£º
²âÊÔÎļþ£º
(void)testPerformanceExample {//»á½«·½·¨ÖеÄblock´úÂëºÄ·Ñʱ³¤´òÓ¡³öÀ´--ĬÈÏÖ´ÐÐÁË10´Î£¬´òÓ¡³öÁËÆ½¾ùºÄʱ£¬ºÍ¸÷´ÎµÄºÄʱ£¬×î´óÎó²î²»³¬¹ý10%¡£
//
This is an example of a performance
test case.[self
measureBlock:^{
// Put the code you want to measure
the time of here.
[TestModel1 randomModels];
// for (int i = 0; i<100; ++i) {
// NSLog(@"wgj:%d",i);
// }
}];
} |
×Ô¶¨ÒåµÄmodelÎļþÖÐÌí¼Ó£º
(NSArray<TestModel1 *> )randomModels
{
NSMutableArray models = @[].mutableCopy;
NSArray * names = @[
@"xiaoli01", @"xiaoli02",
@"xiaoli03",
@"xiaoli04",
@"xiaoli05"
]; |
NSArray * ages = @[
@15, @20, @25, @30, @35
]; |
NSArray * flags = @[
@123, @456, @789, @012, @234
]; |
for (NSUInteger idx = 0; idx <
100; idx++) {
TestModel1 * model = [self modelWithName:
names[arc4random()
% names.count] age:
ages[arc4random()
% ages.count] flags:
[flags[arc4random()
% flags.count]
unsignedIntegerValue]];
[models addObject: model];
[NSThread sleepForTimeInterval: 0.01]; |
}
return models;
}
ÔÚÆ½³£µÄtest·½·¨ÖУ¬Ò²»á´òÓ¡²âÊÔ·½·¨µÄÖ´ÐÐʱ¼ä£¬ÀýÈçÏÂÃæ,µ«ÊÇûÓÐÉÏÃæÕâÖÖÔÚÐÔÄܲâÊÔ·½·¨ÖвâµÄ׼ȷ¡£

´òӡ̨»á´òÓ¡¸÷²âÊÔ·½·¨µÄºÄʱ£¬Ö±½ÓʹÓõ¥Ôª²âÊÔÀ´»ñȡij¶Î´úÂëµÄÖ´ÐÐʱ¼äÒª±ÈʹÓÃinstrument¿ìµÄ¶à£¨instrument¶¨Î»¸ü¾«È·£©¡£Í¨¹ýÐÔÄܲâÊÔÖ±¹ÛµÄ»ñȡִÐÐʱ¼äºó£¬ÎÒÃÇ¿ÉÒÔ¸ù¾ÝÐèÒªÀ´¾ö¶¨ÊÇ·ñ½«ÕâЩ´úÂë·Åµ½×ÓÏß³ÌÖÐÖ´ÐÐÀ´ÓÅ»¯´úÂ루ºÜ¶àʱºò£¬Êý¾Ýת»»»áÕ¼ÓôóÁ¿µÄCPU¼ÆËã×ÊÔ´£©
3.Òì²½²âÊÔ
ÔÚXcode 6֮ǰµÄ°æ±¾ÀïÃæ²¢Ã»ÓÐÄÚÖÃXCTest£¬ÏëʹÓÃXcode²âÊÔµÄÖ»ÄÜÊÇÔÚÖ÷Ï̵߳ÄRunLoopÀïÃæÊ¹ÓÃÒ»¸öwhileÑ»·,È»ºóÒ»Ö±µÈ´ýÏìÓ¦»òÕßÖ±µ½timeout.£¨Xcode
6ÖÐÌí¼ÓÁËÐÂÌØÐÔ£ºXCTestExpectation ºÍÐÔÄܲâÊÔ£ºÌØÐÔÊÇÄÚ½¨µÄ¶ÔÓÚÒì²½²âÊÔµÄÖ§³Ö£¬²âÊÔÄܹ»ÎªÁËÈ·¶¨µÄºÏÊʵÄÌõ¼þµÈ´ýÒ»¸öÖ¸¶¨Ê±¼ä³¤¶È£¬¶ø²»ÐèÒªÇóÖúÓÚGCD£©
modelÎļþ£º
(void)testAsync
{// Òì²½²âÊÔ
NSDictionary * dict = @{
@"name": @"MrLi",
@"age": @28,
@"flags": @987
}; |
TestModel1 * model = [[TestModel1
alloc ] init With Dictionary: dict ] ;
XCTAssertNotNil(model);
[model asyncConvertToData];
while (model.data == nil) {
CFRunLoopRunInMode(kCFRunLoopDe
faultMode, 0.01,
YES);
NSLog(@"waiting"); |
XCTAssertNotNil(model.data);
NSLog(@"convert finish %@",
model. data);
}
modelÎļþ£º
(void)asyncConvertToData
{
dispatch_async(dispatch_get_global
_ queue ( DISPATCH _ QUEUE _ PRIORITY _ DEFAULT ,
0 ), ^{
NSDictionary * modelJSON = nil;
for (NSInteger idx = 0; idx < 20;
idx++) {
modelJSON = [self modelToDictionary];
[self setValuesForKeysWithDictionary
: modelJSON];
[NSThread sleepForTimeInterval: 0.001];
}
_data = [NSJSONSerialization dataWith
JSONObject: modelJSON
options: NSJSON
WritingPrettyPrinted
error: nil]; |
});
}
e.g.з½·¨
ÔÚXcode 6Àƻ¹ûÒÔXCTestExpectionÀàµÄ·½Ê½ÏòXCTest¿ò¼ÜÀïÌí¼ÓÁ˲âÊÔÆÚÍû(test
expection)¡£µ±ÎÒÃÇʵÀý»¯Ò»¸ö²âÊÔÆÚÍû(XCTestExpectation)µÄʱºò£¬²âÊÔ¿ò¼Ü¾Í»áÔ¤¼ÆËüÔÚÖ®ºóµÄijһʱ¿Ì±»ÊµÏÖ¡£×îÖյijÌÐòÍê³É´úÂë¿éÖеIJâÊÔ´úÂë»áµ÷ÓÃXCTestExpectionÀàÖеÄfulfill·½·¨À´ÊµÏÖÆÚÍû¡£
ÎÒÃÇÈòâÊÔ¿ò¼ÜµÈ´ý(ÓÐʱÏÞ)²âÊÔÆÚÍûͨ¹ýXCTestCaseµÄwaitForExpectationsWithTimeout:handler:·½·¨ÊµÏÖ¡£Èç¹ûÍê³É´¦ÀíµÄ´úÂëÔÚÖ¸¶¨Ê±ÏÞÀïÖ´Ðв¢µ÷ÓÃÁËfulfill·½·¨£¬ÄÇô¾Í˵Ã÷ËùÓеIJâÊÔÆÚÍûÔÚ´ËÆÚ¼ä¶¼ÒѾ±»ÊµÏÖ¡£´Ë·½·¨ÖеÄhandlerµÄ²ÎÊýÆäʵÊÇÒ»¸öblock£¬blockÖÐÈôÊÇдÓдúÂ룬´úÂëÖ´ÐеÄÌõ¼þ£¨Âú×ãÆäÖÐÖ®Ò»¾Í¿ÉÖ´ÐУ©£ºa¡¢ËùÓÐÆÚÍûÔÚÖ¸¶¨µÄʱ¼äÄÚ¶¼ÒÔʵÏÖ£»
b¡¢ÆÚÍûÔÚÖ¸¶¨µÄʱ¼äÄÚûÓÐʵÏÖ£¨´Ëʱ»á±¨´í£¬µ«ÊÇblockÀïÃæµÄ·½·¨»áÖ´ÐУ©¡£
´úÂ룺
(void)testAsyncOutTime{
XCTestExpectation *ex = [self expectationWith
Description : @" wgj001 " ] ;
NSURL
*url = [NSURL URLWithString
:@"https://www.baidu.com"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLS
essionConfiguration defaultSession
Configuration]];
NSURLRequest *request = [NSURLRequest
requestWithURL:url];
NSURLSessionTask *task = [session
dataTaskWithRequest:request completion
Handler:^(NSData * _Nullable data,
NSURLResponse * _Nullable response,
NSError * _Nullable error) {
NSLog(@"urlÇëÇóÍê³É");
[ex fulfill];//Èç¹ûÍê³É´¦ÀíµÄ´úÂëÔÚÖ¸¶¨
ʱÏÞÀïÖ´Ðв¢µ÷ÓÃÁËfulfill·½·¨£¬ÄÇô¾Í
˵Ã÷ËùÓеIJâÊÔÆÚÍûÔÚ´ËÆÚ¼ä¶¼ÒѾ±»ÊµÏÖ
}];
[task resume];
[self waitForExpectationsWithTimeout:
1 handler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"wati:%@",error);
} |
¶ÏÑÔ£º
1¡¢XCTFail(...):²ÎÊý¿ÉÓпÉÎÞ£¬ÈôÓÐÔòÐëÊÇ×Ö·û´®£¬²ÎÊýΪ´íÎóµÄÃèÊö¡£ÎÞÌõ¼þµÄ¶¼ÊDzâÊÔʧ°Ü¡£ÔÚ²âÊÔÇý¶¯ÀïÓÐÕâô¸öÇé¿ö£¬Ä㶨ÒåÁ˲âÊÔ·½·¨£¬µ«ÊÇûÓиø³ö¾ßÌåµÄʵÏÖ¡£ÄÇôÄã²»»áÏ£ÍûÕâ¸ö²âÊÔÄÜͨ¹ýµÄ¡£Ò»°ã±»ÓÃ×÷Ò»¸öռλ¶ÏÑÔ¡£µÈÄãµÄ²âÊÔ·½·¨ÍêÉÆºÃÁËÖ®ºóÔÙ»»³É×îÌù½üÄãµÄ²âÊԵĶÏÑÔ¡£ÓлòÕߣ¬ÔÚijЩÇé¿öÏÂelseÁËÖ®ºó¾ÍÊDz»Ó¦¸Ã³öÏÖµÄÇé¿ö¡£ÄÇôÕâ¸öʱºò¿ÉÒÔ°ÑXCTFail·ÅÔÚÕâ¸öelseÀïÃæ¡£
2¡¢XCTAssertNil(expression, ...)/XCTAssertNotNil(expression,
...):Åжϸø¶¨µÄ±í´ïʽֵÊÇ·ñΪnil, XCTAssertNil(±í´ïʽΪnilµÄʱºòͨ¹ý)£¬XCTAssertNotNil£¨±í´ïʽ²»ÎªnilµÄʱºòͨ¹ý£©,ÆäÖÐ...ÊÇ´íÎóÃèÊö£¬Îª×Ö·û´®ÀàÐÍ£¬ÏÂÃæµÄ±í´ïʽÖеÄÒâ˼¶¼ÊÇÒ»ÑùµÄ¡£
3¡¢XCTAssert(expression, ...)£ºÈç¹ûexpression£¨±í´ïʽ£©Ö´ÐеĽá¹ûΪtrueµÄ»°£¬Õâ¸ö²âÊÔͨ¹ý¡£·ñÔò£¬²âÊÔʧ°Ü£¬²¢ÔÚconsoleÖÐÊä³öºóÃæµÄformat×Ö·û´®.
4¡¢ºóÃæ»ùÓÚXCTAssertÑÝ»¯³öÀ´µÄ¶ÏÑÔ£¬²»½ö¿ÉÒÔÂú×ã²âÊÔµÄÐèÇó¶øÇÒ¿ÉÒÔ¸üºÃ¸üÃ÷È·µÄ±í´ï³öÄãÒª²âÊÔµÄÊÇʲô¡£×îºÃÊÇʹÓÃÕâЩÑÝ»¯³öÀ´µÄ¶ÏÑÔ£º
a. Bool²âÊÔ
¶ÔÓÚboolÐ͵ÄÊý¾Ý£¬»òÕßÖ»ÊǼòµ¥µÄboolÐ͵ıí´ïʽ£¬Ê¹ÓÃXCTestAssertTrue»òÕßXCTestAssertFalse£º
XCTAssertTrue(expression,
format...)
XCTAssertFalse(expression, format...) |
b. ÏàµÈ²âÊÔ
²âÊÔÁ½¸öÊýÖµµÄÖµÊÇ·ñÏàµÈʹÓÃXCTAssert[Not]Equal:
XCTAssertEqual(expression1,
expression2, format...)
XCTAssertNotEqual(expression1,
expression2, format...); |
ÅжÏÁ½¸ö¶ÔÏóÓãºXCTAssertEqualObjects(expression1, expression2,
...)ºÍXCTAssertNotEqualObjects(expression1, expression2,
...)
ÔÚDouble¡¢FloatÐÍÊý¾ÝµÄ¶Ô±ÈÖÐʹÓÃXCTAssert[Not]EqualWithAccuracyÀ´´¦Àí¸¡µã¾«¶ÈµÄÎÊÌ⣺
XCTAssertEqualWithAccuracy(expression1,
expression2, accuracy,
format...)
XCTAssertNotEqualWithAccuracy(expression1,
expression2, accuracy,
format...) |
e.g. XCTAssertEqualWithAccuracy(12, 14, 1,@"wgj"),Ôò²»Í¨¹ý£¬ÒòΪ12ºÍ14µÄ²î±ðÒѾ³¬¹ýÁËÉ趨µÄÖµ1¡£
XCTAssertGreaterThan[OrEqual] & XCTAssertLessThan[OrEqual],
ºÍÏÂÃæµÄÌõ¼þ²Ù×÷·û±È½ÏµÄÊÇÒ»¸öÒâ˼ == with >, >=, <, ÒÔ¼° <=
5¡¢Å×Òì³££º
a.
XCTAssertThrows(expression, ...):±í´ïʽÅ×Ò쳣ʱ£¬Í¨¹ý£»·´Ö®£¬²»Í¨¹ý¡£e.g.
XCTAssertThrows([model onlyTest],@"wgj01");·½·¨ÔÚmodelÖÐÖ»ÓÐÉùÃ÷µ«Ã»ÓÐʵÏÖ£¬´Ë±í´ïʽÊÇ»áÒì³£µÄ£¬µ«ÊÇÕâ¾ä²âÊԵĴúÂëÔòÊÇͨ¹ýµÄ¡£
b.
XCTAssertThrowsSpecific(expression, exception_class,
...):±í´ïʽ Å׳öÒì³££¬²¢ÇÒÅ׳öµÄÒì³£ÀàÊôÓÚNSException£¬²Å»áÖ´ÐÐͨ¹ý£»·´Ö®¡£
e.g.
XCTAssertThrowsSpecific([model onlyTest02],NSException,@"wgj001");--onlyTest02·½·¨ÊµÏÖʱ£ºÔËÐбÀÀ££»onlyTest02·½·¨Î´ÊµÏÖʱ£¬Ö´ÐÐδʵÏֵķ½·¨£¬ÏµÍ³»á×Ô¶¯Éú³ÉNSExceptionÀàÐ͵ÄÒì³££¬·ûºÏ¶¨ÒåµÄNSExceptionÀ࣬²âÊÔ´úÂëÔËÐÐͨ¹ý¡£
c.
XCTAssertThrowsSpecificNamed(expression, exception_class,
exception_name, ...)£º±í´ïʽÅ׳öÒì³££¬²¢ÇÒÅ׳öµÄÒì³£ÀàÊôÓÚNSException£¬²¢ÇÒÒì³£ÀàµÄÃû×Ö·ûºÏ¶¨ÒåµÄÃû×Öʱ£¬²Å»áÖ´ÐÐͨ¹ý£»·´Ö®¡£
e.g.
XCTAssertThrowsSpecificNamed([model onlyExceptionTest],
NSException, @"×Ô¶¨ÒåÒì³£",@"wgj002");
modelÖеÄʵÏÖ·½·¨£º
´ËÖÖ£¬²âÊÔ´úÂëÊÇͨ¹ýµÄ¡£
Èô¸ÄΪ£º
XCTAssertThrowsSpecificNamed([model onlyExceptionTest],
NSException, @"Ëæ±ãдµÄÃû×Ö",@"wgj002");Ôò²âÊÔ´úÂ벻ͨ¹ý£¬ÒòΪÒì³£Ãû×Ö²»Æ¥Åä¡£
|