×î½ü¿Æ¼¼¹«Ë¾Á÷Äê²»Àû£¬ÄDZßÓëÕû¸ö¹è¹È³ª·´µ÷µÄ´¨ÆÕÄæÏ®ÉĮ̈ÁË£¬Õâ±ßÌØË¹À±»ÆÀΪÃÀ¹ú×î²»¿É¿¿Æû³µÆ·ÅÆ£¬¾Ý±¨µÀÊÇÒòÎªÌØË¹ÀΪModel
XÔö¼ÓÁ˹ýÓÚ¸´ÔӵŦÄÜ£¨¸ß¿Æ¼¼¶àÒ²¹ÖÎÒ¿©£©£¬ÈçǰÃŲÉÓõ綯¿ªÆô·½Ê½£¬ÖÐÅÅ×ùÒÎʵÏÖÁËµç¶¯ÒÆ¶¯£¬ËùÓÐÕâЩ¹¦ÄÜÕûºÏÔÚÒ»¸öƽ̨ÉÏ£¬µ¼Ö¿ɿ¿ÐÔÏ»¬¡£Í¨Ë×½âÊÍϾÍÊǵ綯ÃÅÓиöСbug£¬µç¶¯×ùÒÎÓÖÓиöСbug£¬Ò»¶ÑСbug×îÖÕµ¼ÖµĴóbug£¬ÈËÃü¹ØÌìÁË£¬±¾Æª¾ÍÀ´Ì¸Ì¸Èí¼þ¿ª·¢ÖбÜÃâСbugµÄ¼¼Êõ£ºµ¥Ôª²âÊÔ¡£
±¾ÎĽ«½éÉÜÒÔÏÂÄÚÈÝ£º
1.iOS¿ª·¢ÖÐÌí¼Óµ¥Ôª²âÊԵķ½·¨¡£
2.ÈçºÎдµ¥Ôª²âÊÔÓÃÀý¼°ÓÃÀý×é¡£
3.½éÉܵ¥Ôª²âÊÔµÄһЩ»ù´¡¸ÅÄî¡£
±¾Æª×÷ÎªÖØ¹¹µÄÀý×Ó£¨ÏëÁ˽âÖØ¹¹ÊÇʲô£¬Áí²Î¼ûËûÃÇ×ÜÔÚËµÖØ¹¹£¬²»¹ýÊÇÖØÐ´
£©£¬¼ÙÉèÁËÒ»¸öÊÓÆµÍøÕ¾µÄµçÓ°µã²¥ÏµÍ³£¬Ã¿´Îµã»÷²¥·Å¾Í»áÊÕÈ¡·ÑÓ㬰´µçÓ°ÖÖÀ಻ͬ£¬Ê±¶Î²»Í¬£¬ÔòÊշѲ»Í¬£¬×îÖÕ¼ÆËã³ö¹Ë¿ÍµÄ×ÜÏû·Ñ£¬²¢¼ÆËã»ý·Ö¡£Õâ¸öÀý×ÓµÄÀà¹ØÏµ±È½ÏÇåÎúÒ×¶®£¬ÓÃOCÓïÑÔʵÏÖ£¬iOS¿ª·¢µÄͯЬ¿´ÆðÀ´»á±È½ÏÇ×ÇУ¬Ðļ±µÄͯЬ¿ÉÒÔÌø¹ýÔ´Â벿·Ö£¬ÏÈ¿´ºóÃæÌí¼Óµ¥Ôª²âÊԵIJ¿·Ö×¼±¸²âÊÔ¹¤¾ß£¬ÐèÒªÁ˽âϸ½ÚʱÔÙ»ØÍ·¿´Ô´Âë¡£
ϵͳ°üº¬Ò»¸öµçÓ°À࣬¹Ë¿ÍÀ࣬¼°µã²¥À࣬Àà¹ØÏµÈçÏÂͼËùʾ£º

µçÓ°Àà
// // Movie.h // RefactorDemo // // Created by xishi on 16/10/29. // Copyright ? 2016Äê xs. All rights reserved. //
typedef NS_ENUM(NSUInteger, MovieEnum) {
MovieEnumChildrens = 2,
MovieEnumRegular = 0,
MovieEnumNewRelease = 1
};
@class Movie;
@interface Movie : NSObject
@property(nonatomic, copy) NSString *title;
@property(nonatomic) int priceCode;
- (id)initWithTitle:(NSString *)title
priceCode:(int)priceCode;
@end |
// // Movie.m // RefactorDemo // // Created by xishi on 16/10/29. // Copyright ? 2016Äê xs. All rights reserved. //
#import "Movie.h"
@implementation Movie
- (id)initWithTitle:(NSString *)title
priceCode:(int)priceCode {
self = [super init];
if (self) {
_title = title;
_priceCode = priceCode;
}
return self;
}
@end |
µã²¥Àࣺ µã²¥ÀඨÒåÁ˵㲥ÐÐΪ£¬¹ØÐĵ㲥ÁËʲôµçÓ°£¬¼°µã²¥µÄʱ¶Î£¬ÕâЩ¶¼Ó°Ïì×îÖÕÊÕÈ¡µÄ·ÑÓá£
// // Demand.h // RefactorDemo // // Created by xishi on 16/10/29. // Copyright ? 2016Äê xs. All rights reserved. //
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger, TimePeriodEnum)
{
TimePeriodEnumWorkDaytime = 1,
TimePeriodEnumWorkNight = 2,
TimePeriodEnumWeekend = 3
};
@class Movie;
@interface Demand : NSObject
@property(nonatomic) Movie *movie;
@property(nonatomic, assign) int timePeriod;
- (id)initWithMovie:(Movie *)movie
timePeriod:(TimePeriodEnum)timePeriod;
@end |
// // Demand.m // RefactorDemo // // Created by xishi on 16/10/29. // Copyright ? 2016Äê xs. All rights reserved. //
#import "Demand.h"
#import "Movie.h"
@implementation Demand
- (id)initWithMovie:(Movie *)movie
timePeriod:(TimePeriodEnum)timePeriod {
self = [super init];
if (self) {
_movie = movie;
_timePeriod = timePeriod;
}
return self;
}
@end |
¹Ë¿ÍÀࣺ
// // Customer.h // RefactorDemo // // Created by xishi on 16/10/29. // Copyright ? 2016Äê xs. All rights reserved. //
#import <Foundation/Foundation.h>
@class Demand;
@interface Customer : NSObject
- (id)initCustomerWithName:(NSString *)name;
- (void)addDemand:(Demand *)demand;
- (NSString *)statement;
@end |
// // Customer.m // RefactorDemo // // Created by xishi on 16/10/29. // Copyright ? 2016Äê xs. All rights reserved. //
#import "Customer.h"
#import "Demand.h"
#import "Movie.h"
@interface Customer () {
NSString *_name;
NSMutableArray *_demands;
}
@end
@implementation Customer
- (id)initCustomerWithName:(NSString *)name
{
self = [super init];
if (self) {
_name = name;
}
return self;
}
- (void)addDemand:(Demand *)demand {
if (!_demands) {
_demands = [[NSMutableArray alloc] init];
}
[_demands addObject:demand];
}
- (NSString *)statement {
double totalAmount = 0;
int frequentDemandPotnts = 0;
NSMutableString *result = [NSMutableString stringWithFormat:@"%@µÄµã²¥Çåµ¥\\\\n",
_name];
for (Demand *aDemand in _demands) {
double thisAmount = 0;
// ¸ù¾Ý²»Í¬µçÓ°¶¨¼Û£º
switch (aDemand.movie.priceCode) {
case MovieEnumRegular:
thisAmount += 2; // ÆÕͨµçÓ°2ÔªÒ»´Î
break;
case MovieEnumNewRelease:
thisAmount += 3; // еçÓ°3ÔªÒ»´Î
break;
case MovieEnumChildrens:
thisAmount += 1.5; // ¶ùͯµçÓ°1.5ÔªÒ»´Î
}
// ¸ù¾Ý²»Í¬Ê±¶Î¶¨¼Û£º
if (aDemand.timePeriod == TimePeriodEnumWorkDaytime)
thisAmount *= 1.0; // ¹¤×÷ÈÕÈ«¼Û
else
if (aDemand.timePeriod == TimePeriodEnumWeekend)
{
thisAmount *= 0.5; // ÖÜÄ©°ë¼Û
}
else
if (aDemand.timePeriod == TimePeriodEnumWorkNight){
thisAmount *= 1.5; // ϰà1.5±¶
}
frequentDemandPotnts++;
// ÖÜÄ©µã²¥ÐÂÆ¬»ý·Ö·±¶£º
if ((aDemand.movie.priceCode == MovieEnumNewRelease)
&&
aDemand.timePeriod == TimePeriodEnumWeekend)
{
frequentDemandPotnts++;
}
[result appendFormat:@"\\\\t%@\\\\t%@
Ôª\\\\n", aDemand.movie.title, @(thisAmount)];
totalAmount += thisAmount;
}
[result appendFormat:@"·ÑÓÃ×Ü¼Æ %@ Ôª\\\\n",
@(totalAmount).stringValue];
[result appendFormat:@"»ñµÃ»ý·Ö %@", @(frequentDemandPotnts).stringValue];
return result;
}
@end |
×¼±¸²âÊÔ¹¤¾ß
ÕâÀïÑ¡ÓõÄÊÇXCTest£¬ËüÊÇXcode8ÖÐÄÚÖõIJâÊÔ¿ò¼Ü£¬Ê¹ÓÃÆðÀ´·Ç³£¼òµ¥£¬·ÖÒÔÏÂÁ½ÖÖÇé¿öΪÏîÄ¿Ìí¼Ó²âÊÔ£º
1. н¨¹¤³ÌʱÌí¼Óµ¥Ôª²âÊÔ£º

н¨Ê±Ìí¼Óµ¥Ôª²âÊÔ
2.ΪÒÑÓй¤³ÌÌí¼Óµ¥Ôª²âÊÔ
Xcode8ÖÐÌí¼ÓµÄ²½ÖèÓëǰ¼¸´úÓÐËù²»Í¬:

Ìí¼ÓTarget

Óùؼü´Êtest¿ìËÙÕÒµ½Unit Testing
bundle

Ìí¼ÓºÃµ¥Ôª²âÊÔºóµÄ¹¤³Ì½á¹¹
Ìí¼ÓµÚÒ»¸ö²âÊÔ
µÚÒ»¸ö²âÊÔÊǺÜÖØÒªµÄ£¬Ëü¾ö¶¨ÁËÎÒÃǺóÃæ²âÊÔµÄ˼·ºÍ·½Ïò£¬ÕâÀïÒÔÐèҪʲô²âʲôΪָµ¼ÔÔò£¬´Ó½á¹û³ö·¢£¬ËùÒÔÏÈÀ´¿´Ï»ù±¾µÄµã²¥ÐèÇó£º
¹¤×÷Èյ㲥һ²¿ÆÕͨӰƬ£¬ÊÕ·Ñ2Ôª£¬»ýÒ»·Ö¡£
¸ù¾ÝÒÔÉÏÐèÇóÃèÊö£¬ÎÒÃÇÔÚRefactorDemoTests.mÌí¼Ó²âÊÔ·½·¨£º
- (void)testStatement_Regular { Movie *matrixMovie1 = [[Movie alloc] initWithTitle:@"ºÚ¿ÍµÛ¹ú1" priceCode:MovieEnumRegular]; Demand *aDemand1 = [[Demand alloc] initWithMovie:matrixMovie1 timePeriod:TimePeriodEnumWorkDaytime];
// ¹Ë¿Í×âÁÞÒ»²¿£º
Customer *aCustomer = [[Customer alloc] initCustomerWithName:@"Ϫʯ"];
[aCustomer addDemand:aDemand1];
XCTAssertTrue([@"ϪʯµÄµã²¥Çåµ¥\\\\n"
@"\\\\tºÚ¿ÍµÛ¹ú1\\\\t2 Ôª\\\\n"
@"·ÑÓÃ×Ü¼Æ 2 Ôª\\\\n"
@"»ñµÃ»ý·Ö 1"
isEqualToString:[aCustomer statement]],
@"²âÊԵ㲥һ²¿ÆÕͨµçÓ°");
} |
Õâ¸ö²âÊÔÓÃÀýÖУ¬¹Ë¿Í¡°ÏªÊ¯¡±µã²¥ÁËÒ»²¿ÀÏÆ¬¡¶ºÚ¿ÍµÛ¹ú1¡·£¬ÓÉÓÚÊǹ¤×÷ÈÕ£¬Òò´Ë°´Ô¼ÛÊÕÈ¡£¬²¢»ý1·Ö£¬Ïêϸϸ½Ú¿´CutomerÀàÔ´ÂëÖеķ½·¨statement()¡£
°´¿ì½Ý¼ü?U£¬ÔËÐвâÊÔ£¬·¢ÏÖ²âÊÔ±¨´íÁË£º

µÚÒ»´ÎÔËÐвâÊÔ±¨´íÁË
×Ðϸ¼ì²é·¢ÏÖ£¬statment()µÄʵÏÖÖУ¬×ܼÛÓ뵥λûÓпÕÒ»¸ñ£¬Õå×úó¾õµÃ»¹ÊÇ¿ÕÒ»¸ñ±È½ÏÇåÎú£¬ÓÚÊÇÐ޸ĺó£¬Ôٴΰ´¿ì½Ý¼ü?UÔËÐвâÊÔ£¬²âÊÔͨ¹ý£º

²âÊÔͨ¹ýÁË
ÔÚµ¥Ôª²âÊÔÖУ¬ÂÌÉ«±íʾ²âÊÔͨ¹ý£¬ºìÉ«±íʾ²âÊÔʧ°Ü£¬ÒѾ³ÉΪҵ½ç±ê×¼£¬XCTest×ñÑÁËÕâÒ»¹æÔò¡£
²âÊÔÓÃÀý×é
ͨ¹ýµÚÒ»¸öÀý×Ó£¬ÎÒÃÇÖªµÀÁ˲âÊÔÓÃÀý×ÜÊÇÒÔtest¿ªÍ·£¬×÷ΪԼ¶¨Ë׳ɣ¬·²ÊÇtest¿ªÍ·µÄ·½·¨£¬¶¼»á±»XCTest¿ò¼Ü×Ô¶¯ÔËÐУ¬ÏÂÃæÎÒÃÇÌí¼Ó¶ÔÖÜÄ©µã²¥ÓŻݵIJâÊÔ£º
- (void)testStatement_Weekend { Movie *matrixMovie2 = [[Movie alloc] initWithTitle:@"ºÚ¿ÍµÛ¹ú2-֨װÉÏÕó" priceCode:MovieEnumRegular]; Demand *aDemand2 = [[Demand alloc] initWithMovie:matrixMovie2 timePeriod:TimePeriodEnumWeekend];
Customer *aCustomer = [[Customer alloc] initCustomerWithName:@"Ϫʯ"];
[aCustomer addDemand:aDemand2];
XCTAssertTrue([@"ϪʯµÄµã²¥Çåµ¥\\\\n"
@"\\\\tºÚ¿ÍµÛ¹ú2-֨װÉÏÕó\\\\t1 Ôª\\\\n"
@"·ÑÓÃ×Ü¼Æ 1 Ôª\\\\n"
@"»ñµÃ»ý·Ö 1"
isEqualToString:[aCustomer statement]],
@"²âÊԵ㲥һ²¿ÆÕͨµçÓ°£¬ÖÜÄ©°ë¼Û");
} |
Õâ¸ö²âÊÔÓÃÀý³ýÁ˵çÓ°Ãû³Æ²»Ò»ÑùÍ⣬ֻÊǽ«µã²¥Ê±¶ÎÓɹ¤×÷ÈÕ¸ÄΪÁËÖÜÄ©£¬ÒÔ´ËÅжϼÆËã¹æÔòÊÇ·ñÕýÈ·¡£
Õâʱ£¬ÎÒÃÇÒѾÓÐÁ½¸ö²âÊÔÓÃÀýÁË£¬ÎªÁ˼ӿì²âÊÔËÙ¶È£¬´ò¿ªXcode×ó²àµÚ5ÏîµÄ²âÊÔµ¼º½Ãæ°å£¬¿ÉÒÔµ¥¶ÀÖ¸¶¨Ò»¸öÓÃÀýÔËÐУ¬×¢ÒâͼÖбê¼Ç´¦µÄͼ±ê±ä»¯£º

µ¥¶ÀÔËÐÐÒ»¸ö²âÊÔÓÃÀý
Èç´Ë£¬ÎÒÃÇ¿ÉÒÔ½«statementÐèÒª¿¼Âǵķµ»ØÇé¿ö¶¼Ð´³ÉÒ»¸ö¸ö¶¼²âÊÔÓÃÀý£¨ÕâÀï¾Í²»Ò»Ò»ÁоÙÁË£¬Í¯Ð¬ÃÇ¿ÉÒÔ×ÔÐÐʵÏÖ£¬ÓÐÎÊÌâ¿ÉÒÔÆÀÂÛÖÐÌá³ö£¬ËäÈ»ÎÒ²»Ò»¶¨»á»Ø´ð£©£¬¿ÉÒÔÈ·±£±¨±íËã·¨Âú×ãÈ«²¿ÐèÇó¡£
µ¥Ôª²âÊԺ͹¦ÄܲâÊԵIJî±ð
¹¦ÄܲâÊÔµÄÄ¿µÄÊDZ£Ö¤Õû¸öÈí¼þ°üÄÜÕý³£¹¤×÷£¬ËüÃæÏòµÄ¶ÔÏóÊǿͻ§£¬±£ÕÏÈí¼þ¹¦ÄÜ·ûºÏ¿Í»§µÄÒªÇóµÄÖÊÁ¿£¬µ±È»ÕâÀ๤×÷Ó¦¸Ã½»ÓÉϲ°®ÕÒbugµÄרҵ²âÊÔ²¿ÃÅÈ¥´¦Àí£¬ËûÃÇ»áÓÃÓ뿪·¢½ØÈ»²»Í¬µÄ¹¤¾ß£¬²¢ÇÒ²»¹ØÐÄʵÏÖµÄϸ½Ú£¨Õâ¾ÍÊÇÄãÓë²âÊÔÈËÔ±ÀÏÊÇ»°²»Í¶»úµÄÔÒò£©¡£
¶øµ¥Ôª²âÊÔ¹Ø×¢ÊµÏÖµÄϸ½Ú£¬ËüµÄÄ¿±ê¶ÔÏóÊÇÒ»¸öÀ࣬һ¸ö·½·¨£¬ÊÇÎÒÃÇ¿ª·¢ÈËÔ±ÓÃÀ´ÑéÖ¤´úÂëÊÇ·ñÓÐʵÏÖÒì³£µÄ¹¤¾ß£¬Òò´Ëдµ¥Ôª²âÊÔʱ×ÜÊÇѰÕÒÄÇЩ¿ÉÄÜδ´¦ÀíµÄ±ß½ç¡£
²âÊÔÑ»·
´ÓÉÏÃæµÄ¼òµ¥ÓÃÀýÖУ¬ÎÒÃÇÄÜÃ÷ÏÔ¿´µ½ÒÔÏÂͨÓò½Ö裺
1.×¼±¸²âÊÔÊý¾Ý¡£
2.µ÷ÓÃÄ¿±êAPI
3.ÑéÖ¤Êä³öºÍÐÐΪ

²âÊÔÑ»·
С½á
±¾ÎÄͨ¹ýÒ»¸öµçÓ°µã²¥ÏµÍ³µÄÀý×Ó£¬ÑÝʾÁËÒÔÏÂÄÚÈÝ£º
1.iOS¿ª·¢ÖÐÌí¼Óµ¥Ôª²âÊÔ¿ò¼ÜXCTest¡£
2. ÓÃtest·½·¨×éÖ¯µ¥Ôª²âÊÔÓÃÀý¼°ÓÃÀý×飬¼´¿ÉͳһÔËÐУ¬Ò²¿Éµ¥¶ÀÔËÐС£
3. ½éÉܵ¥Ôª²âÊÔµÄһЩ»ù´¡¸ÅÄÁ˽ⵥԪ²âÊÔµÄÄ¿±ê£¬¼°²âÊÔÑ»·¡£
ÕâЩÊǽ«À´½øÒ»²½µÄÖØ¹¹µÄ»ù´¡ºÍǰÌᣬÏÞÓÚÆª·ù£¬·ÂÔì¶ÔÏóµÈµ¥Ôª²âÊÔ¼¼Êõ»¹Î´Ìá¼°£¬»¶Ó¹Ø×¢ÏªÊ¯£¬ÇÒÌýÏ»طֽ⡣
|