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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ûÓе¥Ôª²âÊÔ£¬ºÎÌ¸ÖØ¹¹
 
×÷ÕߣºÏªÊ¯iOS À´Ô´£º¼òÊé ·¢²¼ÓÚ£º 2017-3-30
  3262  次浏览      28
 

×î½ü¿Æ¼¼¹«Ë¾Á÷Äê²»Àû£¬Ä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. ½éÉܵ¥Ôª²âÊÔµÄһЩ»ù´¡¸ÅÄÁ˽ⵥԪ²âÊÔµÄÄ¿±ê£¬¼°²âÊÔÑ­»·¡£

ÕâЩÊǽ«À´½øÒ»²½µÄÖØ¹¹µÄ»ù´¡ºÍǰÌᣬÏÞÓÚÆª·ù£¬·ÂÔì¶ÔÏóµÈµ¥Ôª²âÊÔ¼¼Êõ»¹Î´Ìá¼°£¬»¶Ó­¹Ø×¢ÏªÊ¯£¬ÇÒÌýÏ»طֽ⡣

 

   
3262 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù