国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

iOS 單元測試之常用框架 OCMock 詳解 | 京東云技術(shù)團(tuán)隊(duì)

這篇具有很好參考價(jià)值的文章主要介紹了iOS 單元測試之常用框架 OCMock 詳解 | 京東云技術(shù)團(tuán)隊(duì)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、單元測試

1.1 單元測試的必要性

測試驅(qū)動開發(fā)并不是一個很新鮮的概念了。在日常開發(fā)中,很多時候需要測試,但是這種輸出是必須在點(diǎn)擊一系列按鈕之后才能在屏幕上顯示出來的東西。測試的時候,往往是用模擬器一次一次的從頭開始啟動 app,然后定位到自己所在模塊的程序,做一系列的點(diǎn)擊操作,然后查看結(jié)果是否符合自己預(yù)期。

這種行為無疑是對時間的巨大浪費(fèi)。于是有很多資深工程師們發(fā)現(xiàn),我們是可以在代碼中構(gòu)造一個類似的場景,然后在代碼中調(diào)用我們之前想要檢查的代碼,并將運(yùn)行結(jié)果和設(shè)想結(jié)果在程序中進(jìn)行比較,如果一致,則說明我們的代碼沒有問題,由此就產(chǎn)生了單元測試。

1.2 單元測試的目的

單元測試的主要目的是發(fā)現(xiàn)模塊內(nèi)部邏輯、語法、算法和功能錯誤。

單元測試主要是基于白盒測試驗(yàn)證以下問題:

  • 驗(yàn)證代碼與設(shè)計(jì)相符度。
  • 發(fā)現(xiàn)設(shè)計(jì)和需求中存在錯誤。
  • 發(fā)現(xiàn)在編碼過程中引入的錯誤。

單元測試關(guān)注的重點(diǎn)有以下部分:

iOS 單元測試之常用框架 OCMock 詳解 | 京東云技術(shù)團(tuán)隊(duì)

**獨(dú)立路徑-**對于基本執(zhí)行路徑和循環(huán)進(jìn)行測試,可能的錯誤有:

  • 不同數(shù)據(jù)類型的比較。
  • “差1錯”,即可能多循環(huán)或少循環(huán)一次。
  • 錯誤或不可能的終止條件。
  • 不適當(dāng)?shù)男薷牧搜h(huán)變量。

**局部數(shù)據(jù)結(jié)構(gòu)-**單元的局部數(shù)據(jù)結(jié)構(gòu)是最常見的錯誤來源,應(yīng)設(shè)計(jì)測試用例以檢查可能的錯誤:

  • 不一致的數(shù)據(jù)類型。
  • 檢查不正確或不一致的數(shù)據(jù)類型。

**錯誤處理-**比較完善的單元設(shè)計(jì)要能預(yù)見出錯的條件,并設(shè)置適當(dāng)?shù)腻e誤處理,以便在程序出錯時,能對錯誤重新做安排,保證期邏輯上的正確性:

  • 出錯的描述難以理解。
  • 顯示的錯誤與實(shí)際的錯誤不符。
  • 對錯誤條件的處理不正確。

**邊界條件-**邊界上出現(xiàn)錯誤是最常見的錯誤現(xiàn)象:

  • 取最大最小值發(fā)生錯誤。
  • 控制流中的大于、小于這些比較值常出現(xiàn)錯誤。

**單元接口-**接口實(shí)際上就是輸入和輸出對應(yīng)關(guān)系的集合,要對單元進(jìn)行動態(tài)測試無非就是給這個單元一個輸入,然后檢查輸出是否和預(yù)期一致。如果數(shù)據(jù)不能正常輸入和輸出,單元測試就無從談起,因此需要對單元接口進(jìn)行如下的測試:

  • 被測單元的輸入、輸出在個數(shù)、屬性、順序是否和詳細(xì)設(shè)計(jì)中的描述一致。
  • 是否修改了只做輸入用的形式參數(shù)。
  • 約束條件是否通過形式參數(shù)來傳送。

1.3 單元測試依賴的兩個主要框架

OCUnit(即用 XCTest 進(jìn)行測試)其實(shí)就是蘋果自帶的測試框架,主要是斷言使用,由于使用簡單本次文章不過多介紹。

OCMock主要功能是模擬某個方法或者屬性的返回值,你可能會疑惑為什么要這樣做?使用模型生成的模型對象,再傳進(jìn)去不就可以了?答案是可以的,但是有特殊的情況,比如一些不容易構(gòu)造或不容易獲取的對象,此時你可以創(chuàng)建一個虛擬的對象來完成測試。實(shí)現(xiàn)思想是根據(jù)要mock的對象的class來創(chuàng)建一個對應(yīng)的對象,并且設(shè)置好該對象的屬性和調(diào)用預(yù)定方法后的動作(例如返回一個值,調(diào)用代碼塊,發(fā)送消息等等),然后將其記錄到一個數(shù)組中,接下來開發(fā)者主動調(diào)用該方法,最后做一個verify(驗(yàn)證),從而判斷該方法是否被調(diào)用,或者調(diào)用過程中是否拋出異常等。在單元測試開發(fā)中使用更多難點(diǎn)的也是對OCMock的使用方式不明確,本次文章主要講的就是這個 OCMock 的集成和使用方法。

二、OCMock 的集成與使用

2.1?OCMock 的集成方式

項(xiàng)目集成 OCMock 第三方庫,這個使用 pod 工具直接安裝OCMock框架即可。若使用 iBiu 工具安裝 OCMock 庫需在 podfile 文件同級創(chuàng)建 Podfile.custom。

iOS 單元測試之常用框架 OCMock 詳解 | 京東云技術(shù)團(tuán)隊(duì)

使用普通的 pod 文件相同格式添加 OCmock 如下:

source 'https://github.com/CocoaPods/Specs.git'
pod 'OCMock'

2.2?OCMock 的使用方法

(一)置換方法(存根):告訴 mock 對象,當(dāng) someMethod 被調(diào)用,返回什么值

調(diào)用方式:

d jalopy = [OCMock mockForClass[Car class]];
OCMStub([jalopy goFaster:[OCMArg any] units:@"kph"]).andReturn(@"75kph");

使用場景:

1. 驗(yàn)證 A 方法時,A 方法內(nèi)部使用 B 方法的返回值但是 B 方法內(nèi)部邏輯比較復(fù)雜,這時需要使用 stub 方法去存根 B 方法的返回值。代碼實(shí)現(xiàn)類似下面代碼實(shí)現(xiàn)固定 funcB 的返回值,做到在不影響源代碼的條件下,獲取滿足測試需要的參數(shù)。

方法進(jìn)行存根前

- (NSString *)getOtherTimeStrWithString:(NSString *)formatTime{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; //(@"YYYY-MM-dd hh:mm:ss") ----------設(shè)置你想要的格式,hh與HH的區(qū)別:分別表示12小時制,24小時制
    //設(shè)置時區(qū)選擇北京時間
    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
    [formatter setTimeZone:timeZone];
    NSDate* date = [formatter dateFromString:formatTime]; //------------將字符串按formatter轉(zhuǎn)成nsdate
    //時間轉(zhuǎn)時間戳的方法:
    NSInteger timeSp = [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue] * 1000;
    return [NSString stringWithFormat:@"%ld",(long)timeSp];
}

使用stub(mockObject getOtherTimeStrWithString).andReturn(@“1000”)存根后類似于以下效果

- (NSString *)getOtherTimeStrWithString:(NSString *)formatTime{
    
    return @"1000";
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; //(@"YYYY-MM-dd hh:mm:ss") ----------設(shè)置你想要的格式,hh與HH的區(qū)別:分別表示12小時制,24小時制
    //設(shè)置時區(qū)選擇北京時間
    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
    [formatter setTimeZone:timeZone];
    NSDate* date = [formatter dateFromString:formatTime]; //------------將字符串按formatter轉(zhuǎn)成nsdate
    //時間轉(zhuǎn)時間戳的方法:
    NSInteger timeSp = [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue] * 1000;
    return [NSString stringWithFormat:@"%ld",(long)timeSp];
}

2. 代碼正常流程經(jīng)過測試已經(jīng)很健壯了,但是一些錯誤的流程并不容易發(fā)現(xiàn)但是是可能存在的,例如邊緣值數(shù)據(jù),單元測試中可以使用存根對數(shù)據(jù)進(jìn)行模擬,測試代碼在特殊數(shù)據(jù)情況下的運(yùn)行情況。

注:stub()也可以不設(shè)置返回值,驗(yàn)證可行,猜測可能是返回的nil或者void,所以不帶返回值的方法也可以進(jìn)行方法存根。

(二)生成 Mock 對象,目前有三種方式。

通過對Person類的talk方法進(jìn)行測試舉例,其中也涉及Men類以及Animaiton類,以下是三個類的相關(guān)源碼。

Person類

@interface Person()
@property(nonatomic,strong)Men *men;
@end


@implementation Person
-(void)talk:(NSString *)str
{
    [self.men logstr:str];
    [Animaiton logstr:str];
    
}
@end

Men類

@implementation Men
-(NSString *)logstr:(NSString *)str
{
    NSLog(@"%@",str);
    return str;
}
@end

Animaiton類

@implementation Animaiton
+(NSString *)logstr:(NSString *)str
{
    NSLog(@"%@",str);
    return str;
}
-(NSString *)logstr:(NSString *)str
{
    NSLog(@"%@",str);
    return str;
}
@end

對talk方法進(jìn)行單測時需要對person類進(jìn)行mock,以下是通過三種不同的方式生成mock對象,對三種方式的調(diào)用方法,使用場景都做了介紹,最后對每種方式的優(yōu)缺點(diǎn)也做了一個表格方便區(qū)別。

Nice Mock

NiceMock 創(chuàng)建的 mock 對象在進(jìn)行方法測試時會優(yōu)先調(diào)用實(shí)例方法,若未找到實(shí)例方法,會繼續(xù)調(diào)用同名的類方法。因此該方法可以用來生成mock對象去測試類方法也可以測試對象方法。

使用方式:

- (void)testTalkNiceMock {
    id mockA = OCMClassMock([Men class]);
    Person *person1 = [Person new];
    person1.men = mockA;
    [person1 talk:@"123"];
    OCMVerify([mockA logstr:[OCMArg any]]);
}

使用場景:

Nice mock 是比較友好的,當(dāng)一個沒有存根的方法被調(diào)用時他不會引起一個異常會驗(yàn)證通過。如果你不想自己對很多的方法進(jìn)行存根,那么使用 nice mock。在上方的舉例中mockA調(diào)用testTalkNiceMock時,Men類中的+(NSString *)logstr:(NSString *)str不會執(zhí)行打印操作。在調(diào)用過程中因?yàn)橥瑫r存在同名的logstr:類方法和實(shí)例方法,會優(yōu)先調(diào)用實(shí)例方法。

Strict Mock

使用方式:

測試case如下,mockA是Strict Mock生成要調(diào)用testTalkStrictMock方法,則Mock生成要調(diào)用testTalkStrictMock方法則該方法要使用stub進(jìn)行存根,否則最后的OCMVerifyAll(mockA)就會拋出異常。

- (void)testTalkStrictMock {
    id mockA = OCMStrictClassMock([Person class]);
    OCMStub([mockA talk:@"123"]);
    [mockA talk:@"123"];
    OCMVerifyAll(mockA);
}

使用場景:

這種方式創(chuàng)建的 mock 對象,如果調(diào)用未 stub(stub 代表存根)的方法,會拋出一個異常。這需要保證在 mock 的生命周期中每一個獨(dú)立調(diào)用的方法都是被存根的,這種方法使用比較嚴(yán)格,很少使用。

Partial Mock

這樣創(chuàng)建的對象在調(diào)用方法時:如果方法被 stub,調(diào)用 stub 后的方法,如果方法沒有被 stub,調(diào)用原來的對象的方法,該方法有限制只能 mock 實(shí)例對象。

使用方式:

- (void)testTalkPartialMock {
    id mockA = OCMPartialMock([Men new]);
    Person *person1 = [Person new];
    person1.men = mockA;
    [person1 talk:@"123"];
    OCMVerify([mockA logstr:[OCMArg any]]);
}

使用場景:

當(dāng)調(diào)用一個沒有被存根的方法時,會調(diào)用實(shí)際對象的該方法。當(dāng)不能很好的存根一個類的方法時,該技術(shù)是非常有用的。調(diào)用testTalkPartialMock時Men類中的+(NSString *)logstr:(NSString *)str會執(zhí)行打印操作。

三種方式的差異表格:

iOS 單元測試之常用框架 OCMock 詳解 | 京東云技術(shù)團(tuán)隊(duì)

(三)驗(yàn)證方法的調(diào)用

調(diào)用方式:

OCMVerify([mock someMethod]);
OCMVerify(never(),    [mock doStuff]); //從沒被調(diào)用
OCMVerify(times(n),   [mock doStuff]);   //調(diào)用了N次
OCMVerify(atLeast(n), [mock doStuff]);  //最少被調(diào)用了N次
OCMVerify(atMost(n),  [mock doStuff]);

使用場景:

在單元測試中可以驗(yàn)證某個方法是否執(zhí)行,以及執(zhí)行了幾次。

延時驗(yàn)證調(diào)用:

OCMVerifyAllWithDelay(mock, aDelay);

使用場景:該功能用于等待異步操作會比較多,其中aDelay為預(yù)期最長等待時間。

(四)添加預(yù)期

調(diào)用方式:

準(zhǔn)備數(shù)據(jù):

NSDictionary *info = @{@"name": @"momo"};
id mock = OCMClassMock([MOOCMockDemo class]);

添加預(yù)期:

OCMExpect([mock handleLoadSuccessWithPerson:[OCMArg any]]);

可以預(yù)期不執(zhí)行:

OCMReject([mock handleLoadFailWithPerson:[OCMArg any]]);

可以驗(yàn)證參數(shù):

// 預(yù)期 + 參數(shù)驗(yàn)證
OCMExpect([mock handleLoadSuccessWithPerson:[OCMArg checkWithBlock:^BOOL(id obj) {
    MOPerson *person = (MOPerson *)obj;
    return [person.name isEqualToString:@"momo"];
}]]);

可以預(yù)期執(zhí)行順序:

// 預(yù)期下列方法順序執(zhí)行
[mock setExpectationOrderMatters:YES];
OCMExpect([mock handleLoadSuccessWithPerson:[OCMArg any]]);
OCMExpect([mock showError:NO]);

可以忽略參數(shù)(預(yù)期方法執(zhí)行時):

OCMExpect([mock showError:YES]).ignoringNonObjectArgs; // 忽視參數(shù)

執(zhí)行:

[MOOCMockDemo handleLoadFinished:info];

斷言:

OCMVerifyAll(mock);

可以延遲斷言:

OCMVerifyAllWithDelay(mock, 1); // 支持延遲驗(yàn)證

最后的 OCMVerifyAll 會驗(yàn)證前面的期望是否有效,只要有一個沒調(diào)用,就會出錯。

(五)參數(shù)約束

調(diào)用方式:

OCMStub([mock someMethodWithAnArgument:[OCMArg any]])
OCMStub([mock someMethodWithPointerArgument:[OCMArg anyPointer]])
OCMStub([mock someMethodWithSelectorArgument:[OCMArg anySelector]])

使用場景:在使用 OCMVerify()方法驗(yàn)證某個方法是否調(diào)用是使用,單元測試會驗(yàn)證方法參數(shù)是否一致,如果不一致就是提示驗(yàn)證失敗,此時如果只關(guān)注方法調(diào)用,并不關(guān)注參數(shù)即可使用[OCMArg any]傳參。

(六)網(wǎng)絡(luò)接口的模擬

顧名思義可以 mock 網(wǎng)絡(luò)接口的數(shù)據(jù)返回,測試不同數(shù)據(jù)下代碼的走向以及準(zhǔn)確性。

調(diào)用方式:

id mockManager = OCMClassMock([JDStoreNetwork class]);
[orderListVc setComponentsNet:mockManager];
[OCMStub([mockManager startWithSetup:[OCMArg any] didFinish:[OCMArg any] didCancel:[OCMArg any]]) andDo:^(NSInvocation *invocation) {   


    void (^successBlock)(id components,NSError *error) = nil;   
    
    [invocation getArgument:&successBlock atIndex:3];  
    
    successBlock(@{@"code":@"1",@"resultCode":@"1",@"value":@{@"showOrderSearch":@"NO"}},nil);
    }];

以上就是在調(diào)用 setComponentsNet 方法內(nèi)部調(diào)用了接口,該方法就可以在調(diào)用接口后模擬需要的返回?cái)?shù)據(jù),successBlock 中的就是返回的測試數(shù)據(jù)。本方式是通過獲取接口調(diào)用的方法簽名,獲取 successBlock 成功回調(diào)傳參并手動調(diào)用。同樣可以模擬接口失敗的情況,只需獲取到簽名中的對應(yīng)的失敗回調(diào)就可以實(shí)現(xiàn)了。

使用場景:書寫單元測試方法時涉及網(wǎng)絡(luò)接口的模擬,通過該方式 mock 接口返回結(jié)果。

(七)恢復(fù)類

置換類方法后,可以將類恢復(fù)到原來的狀態(tài),通過調(diào)用 stopMocking 來完成。

調(diào)用方式:

id classMock = OCMClassMock([SomeClass class]);
/* do stuff */
[classMock stopMocking];

使用場景:

正常對實(shí)例對象置換后,mock 對象釋放后會自動調(diào)用 stopMocking,但是添加到類方法上的 mock 對象會跨越了多個測試,mock 的類對象在置換后不會 deallocated,需要手動來取消這個 mock 關(guān)系。

(八)觀察者模擬-創(chuàng)建一個接受通知的實(shí)例

調(diào)用方式:

- (void)testPostNotification {   
Person *person1 = [[Person alloc] init];   
id observerMock = OCMObserverMock();   
//給通知中心設(shè)置觀察者    
[[NSNotificationCenter defaultCenter] addMockObserver: observerMock name:@"name" object:nil];    
//設(shè)置觀察期望    
[[observerMock expect] notificationWithName:@"name" object:[OCMArg any]];    //調(diào)用要驗(yàn)證的方法    
[person1 methodWithPostNotification];    
[[NSNotificationCenter defaultCenter] removeObserver:observerMock];    
// 調(diào)用驗(yàn)證   
OCMVerifyAll(observerMock);}

使用場景:

創(chuàng)建一個 mock 對象,可以用來觀察通知。mock 必須注冊以接收通知。

(九)mock協(xié)議

調(diào)用方式:

id protocolMock = OCMProtocolMock(@protocol(SomeProtocol));
/*嚴(yán)格的協(xié)議*/
id classMock = OCMStrictClassMock([SomeClass class]);
id protocolMock = OCMStrictProtocolMock(@protocol(SomeProtocol));
id protocolMock = OCMProtocolMock(@protocol(SomeProtocol));
/*嚴(yán)格的協(xié)議*/
id classMock = OCMStrictClassMock([SomeClass class]);
id protocolMock = OCMStrictProtocolMock(@protocol(SomeProtocol));

調(diào)用場景:當(dāng)需要創(chuàng)建一個實(shí)例,讓其具有協(xié)議的所定義的功能時使用。

2.3?mock使用限制

對于同個方法,先stub后expect是不行的:因?yàn)橄萻tub的話,所有的調(diào)用都會變成stub,這樣子即使過程調(diào)用該方法,最后OCMVerifyAll驗(yàn)證也會失??;解決的辦法是,在OCMExpect上順便stub,比如:OCMExpect([mock someMethod]).andReturn(@“a string”),或者將stub置于expect之后。

部分模擬不適用于某些類:如NSString和NSDate,這些”toll-free bridged”的類,否則會拋出異常。

某些方法不能stub:如:init、class、methodSignatureForSelector、forwardInvocation這些。

NSString與NSArray的類方法不能stub,否則無效。

NSObject的方法調(diào)用不能驗(yàn)證,除非在子類中重寫。

蘋果核心類的私有方法調(diào)用不能被驗(yàn)證,如以_開頭的方法。

延時驗(yàn)證方法調(diào)用不支持,暫時只支持期望-運(yùn)行-驗(yàn)證模式的延時驗(yàn)證。

OCMock不支持多線程。

三、最后

希望這篇文章和例子已經(jīng)陳述清楚了一些 OCMock 最通用的用法。OCMock 站點(diǎn):http://ocmock.org/features/ 是一個最好的學(xué)習(xí) OCMock 的地方。mock 是單調(diào)的但是對于一個應(yīng)用程序卻是必須的。如果一個方法很難用 mock 來測試,這個跡象表明你的設(shè)計(jì)需要重新考慮了。

參考鏈接:

OCMock 官網(wǎng):https://ocmock.org/features/

OCMock3 參考:https://www.cnblogs.com/xilifeng/p/4690280.html#header-c18

iOS測試系列:http://blog.oneinbest.com/2017/07/27/iOS%E6%B5%8B%E8%AF%95%E7%B3%BB%E5%88%97-%E4%B8%89-OCMock%E7%9A%84%E4%BD%BF%E7%94%A8/

作者:京東零售?王中文

來源:京東云開發(fā)者社區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-487435.html

到了這里,關(guān)于iOS 單元測試之常用框架 OCMock 詳解 | 京東云技術(shù)團(tuán)隊(duì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 單元測試框架之unittest詳解

    單元測試框架之unittest詳解

    1.unittest簡介 unittest是python自帶的單元測試框架,不僅僅適用于單元測試,還可用于web端、appium、接口自動化測試用例的開發(fā)與執(zhí)行。 ? 2.unittest四大核心組件 1)TestCase: 測試用例類,用來定義用例函數(shù) 2)TestSuite: 測試套件,用于收集測試用例 3)TestRunner:測試用例運(yùn)行類,用

    2024年02月15日
    瀏覽(27)
  • ?基于多種語言,使用Selenium實(shí)現(xiàn)自動化的常用單元測試框架

    ?基于多種語言,使用Selenium實(shí)現(xiàn)自動化的常用單元測試框架

    Selenium是自動化網(wǎng)絡(luò)應(yīng)用程序的首選工具。Selenium支持基于Java、C#、PHP、Ruby、Perl、JavaScript和Python等多種編程語言的各種單元測試框架。這些框架用于在 Windows、MacOS 和 Linux 等不同平臺的網(wǎng)絡(luò)應(yīng)用程序上執(zhí)行測試腳本。任何成功的自動化流程都有賴于強(qiáng)大的測試框架,這些框架

    2024年01月21日
    瀏覽(27)
  • Junit5單元測試框架詳解

    Junit5單元測試框架詳解

    前面我們學(xué)習(xí)了Selenium自動化測試框架,但是有的時候測試用例會很多,我們需要一個工具來管理這些測試用例,而Junit就是一個很好的管理工具,簡單點(diǎn)來說,Junit就是一個針對Java的單元測試框架; 目錄 一.?關(guān)于Junit5 二. Junit使用 2.1 添加Maven依賴 2.2 注解 2.3 斷言 2.4 套件

    2024年02月06日
    瀏覽(28)
  • 2023單元測試?yán)鱉ockito框架詳解(超詳細(xì)~)

    2023單元測試?yán)鱉ockito框架詳解(超詳細(xì)~)

    Mockito ?是當(dāng)前最流行的? 單元測試 ? Mock ?框架。采用? Mock ?框架,我們可以? 虛擬 ?出一個? 外部依賴 ,降低測試? 組件 ?之間的? 耦合度 ,只注重代碼的? 流程與結(jié)果 ,真正地實(shí)現(xiàn)測試目的。 Mock ?的中文譯為仿制的,模擬的,虛假的。對于測試框架來說,即構(gòu)造出一

    2024年02月10日
    瀏覽(51)
  • 詳解JUnit單元測試框架(打樁測試待更新)示例代碼有格式問題,待更新

    詳解JUnit單元測試框架(打樁測試待更新)示例代碼有格式問題,待更新

    單元測試負(fù)責(zé)對最小的軟件設(shè)計(jì)單元(模塊)進(jìn)行驗(yàn)證,根據(jù)軟件設(shè)計(jì)文檔中對模塊功能的描述,對重要的程序分支進(jìn)行測試并發(fā)現(xiàn)錯誤。 對于單元測試框架來講,它主要完成以下幾件事。 提供用例組織與執(zhí)行: 測試用例只有幾條時,可以不考慮用例組織,但是用例達(dá)到成

    2024年02月05日
    瀏覽(31)
  • 【白盒測試】單元測試的理論基礎(chǔ)及用例設(shè)計(jì)技術(shù)(6種)詳解

    【白盒測試】單元測試的理論基礎(chǔ)及用例設(shè)計(jì)技術(shù)(6種)詳解

    目錄 ??前言 ???1. 單元測試的理論基礎(chǔ) ??1.1 單元測試是什么 ??1.2 單元測試的好處 ??1.3?單元測試的要求 ??1.4?測試框架-Junit4的介紹 ??1.5?單元測試為什么要mock ???2. 單元測試用例設(shè)計(jì)技術(shù)(6種) ??2.1?語句覆蓋 ??2.2 判定覆蓋【也稱分支覆蓋】 ??2.3 條件覆蓋

    2024年04月27日
    瀏覽(20)
  • 從iOS App啟動速度看如何為基礎(chǔ)性能保駕護(hù)航 | 京東物流技術(shù)團(tuán)隊(duì)

    從iOS App啟動速度看如何為基礎(chǔ)性能保駕護(hù)航 | 京東物流技術(shù)團(tuán)隊(duì)

    啟動是App給用戶的第一印象,一款A(yù)pp的啟動速度,不單單是用戶體驗(yàn)的事情,往往還決定了它能否獲取更多的用戶。所以到了一定階段App的啟動優(yōu)化是必須要做的事情。App啟動基本分為以下兩種 App 點(diǎn)擊啟動前,它的進(jìn)程不在系統(tǒng)里,需要系統(tǒng)新創(chuàng)建一個進(jìn)程分配給它啟動的

    2024年02月15日
    瀏覽(21)
  • SLF4J門面日志框架源碼探索 | 京東云技術(shù)團(tuán)隊(duì)

    SLF4J門面日志框架源碼探索 | 京東云技術(shù)團(tuán)隊(duì)

    SLF4J即Simple Logging Facade for Java,它提供了Java中所有日志框架的簡單外觀或抽象。因此,它使用戶能夠使用單個依賴項(xiàng)處理任何日志框架,例如:Log4j,Logback和JUL(java.util.logging)。通過在類路徑中插入適當(dāng)?shù)?jar 文件(綁定),可以在部署時插入所需的日志框架。如果要更換日志

    2024年02月11日
    瀏覽(19)
  • Flink測試?yán)髦瓺ataGen初探 | 京東云技術(shù)團(tuán)隊(duì)

    Flink測試?yán)髦瓺ataGen初探 | 京東云技術(shù)團(tuán)隊(duì)

    Flink SQL 是基于 Apache Calcite 的 SQL 解析器和優(yōu)化器構(gòu)建的,支持ANSI SQL 標(biāo)準(zhǔn),允許使用標(biāo)準(zhǔn)的 SQL 語句來處理流式和批處理數(shù)據(jù)。通過 Flink SQL,可以以聲明式的方式描述數(shù)據(jù)處理邏輯,而無需編寫顯式的代碼。使用 Flink SQL,可以執(zhí)行各種數(shù)據(jù)操作,如過濾、聚合、連接和轉(zhuǎn)換

    2024年02月07日
    瀏覽(19)
  • 性能測試監(jiān)控指標(biāo)及分析調(diào)優(yōu) | 京東云技術(shù)團(tuán)隊(duì)

    1、CPU,如果存在大量的計(jì)算,他們會長時間不間斷的占用CPU資源,導(dǎo)致其他資源無法爭奪到CPU而響應(yīng)緩慢,從而帶來系統(tǒng)性能問題,例如頻繁的FullGC,以及多線程造成的上下文頻繁的切換,都會導(dǎo)致CPU繁忙,一般情況下CPU使用率75%比較合適。 2、內(nèi)存,Java內(nèi)存一般是通過jv

    2024年02月06日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包