Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
iOS UnitTestµ¥Ôª²âÊÔ
 
×÷Õߣºî£»­ÖÇÇå À´Ô´£º¼òÊé ·¢²¼ÓÚ2017-6-6
  2647  次浏览      29
 

 

Ò»¡¢µ¥Ôª²âÊԵ͍Òå

ÔÚ¼ÆËã»ú±à³ÌÖУ¬µ¥Ôª²âÊÔ£¨Ó¢Ó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ÖеÄʵÏÖ·½·¨£º

@throw exx;

´ËÖÖ£¬²âÊÔ´úÂëÊÇͨ¹ýµÄ¡£

Èô¸ÄΪ£º

XCTAssertThrowsSpecificNamed([model onlyExceptionTest], NSException, @"Ëæ±ãдµÄÃû×Ö",@"wgj002");Ôò²âÊÔ´úÂ벻ͨ¹ý£¬ÒòΪÒì³£Ãû×Ö²»Æ¥Åä¡£

 

   
2647 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ