主頁 >  其他 > iOS 單元測驗之常用框架 OCMock 詳解

iOS 單元測驗之常用框架 OCMock 詳解

2023-06-17 07:44:57 其他

一、單元測驗

1.1 單元測驗的必要性

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

這種行為無疑是對時間的巨大浪費,于是有很多資深工程師們發現,我們是可以在代碼中構造一個類似的場景,然后在代碼中呼叫我們之前想要檢查的代碼,并將運行結果和設想結果在程式中進行比較,如果一致,則說明我們的代碼沒有問題,由此就產生了單元測驗,

1.2 單元測驗的目的

單元測驗的主要目的是發現模塊內部邏輯、語法、演算法和功能錯誤,

單元測驗主要是基于白盒測驗驗證以下問題:

  • 驗證代碼與設計相符度,
  • 發現設計和需求中存在錯誤,
  • 發現在編碼程序中引入的錯誤,

單元測驗關注的重點有以下部分:

獨立路徑-對于基本執行路徑和回圈進行測驗,可能的錯誤有:

  • 不同資料型別的比較,
  • “差1錯”,即可能多回圈或少回圈一次,
  • 錯誤或不可能的終止條件,
  • 不適當的修改了回圈變數,

區域資料結構-單元的區域資料結構是最常見的錯誤來源,應設計測驗用例以檢查可能的錯誤:

  • 不一致的資料型別,
  • 檢查不正確或不一致的資料型別,

錯誤處理-比較完善的單元設計要能預見出錯的條件,并設定適當的錯誤處理,以便在程式出錯時,能對錯誤重新做安排,保證期邏輯上的正確性:

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

邊界條件-邊界上出現錯誤是最常見的錯誤現象:

  • 取最大最小值發生錯誤,
  • 控制流中的大于、小于這些比較值常出現錯誤,

單元介面-介面實際上就是輸入和輸出對應關系的集合,要對單元進行動態測驗無非就是給這個單元一個輸入,然后檢查輸出是否和預期一致,如果資料不能正常輸入和輸出,單元測驗就無從談起,因此需要對單元介面進行如下的測驗:

  • 被測單元的輸入、輸出在個數、屬性、順序是否和詳細設計中的描述一致,
  • 是否修改了只做輸入用的形式引數,
  • 約束條件是否通過形式引數來傳送,

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

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

OCMock主要功能是模擬某個方法或者屬性的回傳值,你可能會疑惑為什么要這樣做?使用模型生成的模型物件,再傳進去不就可以了?答案是可以的,但是有特殊的情況,比如一些不容易構造或不容易獲取的物件,此時你可以創建一個虛擬的物件來完成測驗,實作思想是根據要mock的物件的class來創建一個對應的物件,并且設定好該物件的屬性和呼叫預定方法后的動作(例如回傳一個值,呼叫代碼塊,發送訊息等等),然后將其記錄到一個陣列中,接下來開發者主動呼叫該方法,最后做一個verify(驗證),從而判斷該方法是否被呼叫,或者呼叫程序中是否拋出例外等,在單元測驗開發中使用更多難點的也是對OCMock的使用方式不明確,本次文章主要講的就是這個 OCMock 的集成和使用方法,

二、OCMock 的集成與使用

2.1 OCMock 的集成方式

專案集成 OCMock 第三方庫,這個使用 pod 工具直接安裝OCMock框架即可,若使用 iBiu 工具安裝 OCMock 庫需在 podfile 檔案同級創建 Podfile.custom,

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

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

2.2 OCMock 的使用方法

(一)置換方法(存根):告訴 mock 物件,當 someMethod 被呼叫,回傳什么值

呼叫方式:

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

使用場景:

1. 驗證 A 方法時,A 方法內部使用 B 方法的回傳值但是 B 方法內部邏輯比較復雜,這時需要使用 stub 方法去存根 B 方法的回傳值,代碼實作類似下面代碼實作固定 funcB 的回傳值,做到在不影響源代碼的條件下,獲取滿足測驗需要的引數,

方法進行存根前

- (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") ----------設定你想要的格式,hh與HH的區別:分別表示12小時制,24小時制
    //設定時區選擇北京時間
    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
    [formatter setTimeZone:timeZone];
    NSDate* date = [formatter dateFromString:formatTime]; //------------將字串按formatter轉成nsdate
    //時間轉時間戳的方法:
    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") ----------設定你想要的格式,hh與HH的區別:分別表示12小時制,24小時制
    //設定時區選擇北京時間
    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
    [formatter setTimeZone:timeZone];
    NSDate* date = [formatter dateFromString:formatTime]; //------------將字串按formatter轉成nsdate
    //時間轉時間戳的方法:
    NSInteger timeSp = [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue] * 1000;
    return [NSString stringWithFormat:@"%ld",(long)timeSp];
}

2. 代碼正常流程經過測驗已經很健壯了,但是一些錯誤的流程并不容易發現但是是可能存在的,例如邊緣值資料,單元測驗中可以使用存根對資料進行模擬,測驗代碼在特殊資料情況下的運行情況,

注:stub()也可以不設定回傳值,驗證可行,猜測可能是回傳的nil或者void,所以不帶回傳值的方法也可以進行方法存根,

(二)生成 Mock 物件,目前有三種方式,

通過對Person類的talk方法進行測驗舉例,其中也涉及Men類以及Animaiton類,以下是三個類的相關原始碼,

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方法進行單測時需要對person類進行mock,以下是通過三種不同的方式生成mock物件,對三種方式的呼叫方法,使用場景都做了介紹,最后對每種方式的優缺點也做了一個表格方便區別,

Nice Mock

NiceMock 創建的 mock 物件在進行方法測驗時會優先呼叫實體方法,若未找到實體方法,會繼續呼叫同名的類方法,因此該方法可以用來生成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 是比較友好的,當一個沒有存根的方法被呼叫時他不會引起一個例外會驗證通過,如果你不想自己對很多的方法進行存根,那么使用 nice mock,在上方的舉例中mockA呼叫testTalkNiceMock時,Men類中的+(NSString *)logstr:(NSString *)str不會執行列印操作,在呼叫程序中因為同時存在同名的logstr:類方法和實體方法,會優先呼叫實體方法,

Strict Mock

使用方式:

測驗case如下,mockA是Strict Mock生成要呼叫testTalkStrictMock方法,則Mock生成要呼叫testTalkStrictMock方法則該方法要使用stub進行存根,否則最后的OCMVerifyAll(mockA)就會拋出例外,

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

使用場景:

這種方式創建的 mock 物件,如果呼叫未 stub(stub 代表存根)的方法,會拋出一個例外,這需要保證在 mock 的生命周期中每一個獨立呼叫的方法都是被存根的,這種方法使用比較嚴格,很少使用,

Partial Mock

這樣創建的物件在呼叫方法時:如果方法被 stub,呼叫 stub 后的方法,如果方法沒有被 stub,呼叫原來的物件的方法,該方法有限制只能 mock 實體物件,

使用方式:

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

使用場景:

當呼叫一個沒有被存根的方法時,會呼叫實際物件的該方法,當不能很好的存根一個類的方法時,該技術是非常有用的,呼叫testTalkPartialMock時Men類中的+(NSString *)logstr:(NSString *)str會執行列印操作,

三種方式的差異表格:

(三)驗證方法的呼叫

呼叫方式:

OCMVerify([mock someMethod]);
OCMVerify(never(),    [mock doStuff]); //從沒被呼叫
OCMVerify(times(n),   [mock doStuff]);   //呼叫了N次
OCMVerify(atLeast(n), [mock doStuff]);  //最少被呼叫了N次
OCMVerify(atMost(n),  [mock doStuff]);

使用場景:

在單元測驗中可以驗證某個方法是否執行,以及執行了幾次,

延時驗證呼叫:

OCMVerifyAllWithDelay(mock, aDelay);

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

(四)添加預期

呼叫方式:

準備資料:

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

添加預期:

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

可以預期不執行:

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

可以驗證引數:

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

可以預期執行順序:

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

可以忽略引數(預期方法執行時):

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

執行:

[MOOCMockDemo handleLoadFinished:info];

斷言:

OCMVerifyAll(mock);

可以延遲斷言:

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

最后的 OCMVerifyAll 會驗證前面的期望是否有效,只要有一個沒呼叫,就會出錯,

(五)引數約束

呼叫方式:

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

使用場景:在使用 OCMVerify()方法驗證某個方法是否呼叫是使用,單元測驗會驗證方法引數是否一致,如果不一致就是提示驗證失敗,此時如果只關注方法呼叫,并不關注引數即可使用[OCMArg any]傳參,

(六)網路介面的模擬

顧名思義可以 mock 網路介面的資料回傳,測驗不同資料下代碼的走向以及準確性,

呼叫方式:

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);
    }];

以上就是在呼叫 setComponentsNet 方法內部呼叫了介面,該方法就可以在呼叫介面后模擬需要的回傳資料,successBlock 中的就是回傳的測驗資料,本方式是通過獲取介面呼叫的方法簽名,獲取 successBlock 成功回呼傳參并手動呼叫,同樣可以模擬介面失敗的情況,只需獲取到簽名中的對應的失敗回呼就可以實作了,

使用場景:書寫單元測驗方法時涉及網路介面的模擬,通過該方式 mock 介面回傳結果,

(七)恢復類

置換類方法后,可以將類恢復到原來的狀態,通過呼叫 stopMocking 來完成,

呼叫方式:

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

使用場景:

正常對實體物件置換后,mock 物件釋放后會自動呼叫 stopMocking,但是添加到類方法上的 mock 物件會跨越了多個測驗,mock 的類物件在置換后不會 deallocated,需要手動來取消這個 mock 關系,

(八)觀察者模擬-創建一個接受通知的實體

呼叫方式:

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

使用場景:

創建一個 mock 物件,可以用來觀察通知,mock 必須注冊以接收通知,

(九)mock協議

呼叫方式:

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

呼叫場景:當需要創建一個實體,讓其具有協議的所定義的功能時使用,

2.3 mock使用限制

對于同個方法,先stub后expect是不行的:因為先stub的話,所有的呼叫都會變成stub,這樣子即使程序呼叫該方法,最后OCMVerifyAll驗證也會失敗;解決的辦法是,在OCMExpect上順便stub,比如:OCMExpect([mock someMethod]).andReturn(@"a string"),或者將stub置于expect之后,

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

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

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

NSObject的方法呼叫不能驗證,除非在子類中重寫,

蘋果核心類的私有方法呼叫不能被驗證,如以_開頭的方法,

延時驗證方法呼叫不支持,暫時只支持期望-運行-驗證模式的延時驗證,

OCMock不支持多執行緒,

三、最后

希望這篇文章和例子已經陳述清楚了一些 OCMock 最通用的用法,OCMock 站點:http://ocmock.org/features/ 是一個最好的學習 OCMock 的地方,mock 是單調的但是對于一個應用程式卻是必須的,如果一個方法很難用 mock 來測驗,這個跡象表明你的設計需要重新考慮了,

參考鏈接:

OCMock 官網:https://ocmock.org/features/

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

iOS測驗系列:http://blog.oneinbest.com/2017/07/27/iOS測驗系列-三-OCMock的使用/

作者:京東零售 王中文

來源:京東云開發者社區

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555372.html

標籤:其他

上一篇:程式員接單,哪些單子需要特別注意?

下一篇:返回列表

標籤雲
其他(161138) Python(38236) JavaScript(25498) Java(18244) C(15237) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7254) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4599) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1967) Web開發(1951) C++(1941) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • iOS 單元測驗之常用框架 OCMock 詳解

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

    uj5u.com 2023-06-17 07:44:57 more
  • 程式員接單,哪些單子需要特別注意?

    眾所周知,國內各行各業都在卷,程式員更是卷王里的佼佼者!所以在接單這方面也是嚴重的僧多粥少,其中還有很大一部分是不靠譜的單子,那么那些單子需要特別注意呢?這里給大家分享一下我這幾年來總結的一些經驗,希望對大家有一點幫助。 ......

    uj5u.com 2023-06-17 07:44:52 more
  • ChatGPT拒絕做這5件事,還有20件它也不會做!

    自從ChatGPT和其他生成式AI應用程式出現以來,我們一直在探索我們可以用它們做什么。看起來ChatGPT可以做任何事情。但在本文中,我們將探討ChatGPT不會或無法做的事情。 ......

    uj5u.com 2023-06-17 07:39:15 more
  • 7個必備JavaScript優化技巧,CodeGeeX 5秒搞定了!

    JavaScript,目前成了使用最廣泛的編程語言。這篇文章給出的是一些 JavaScript 的優化技巧,這些技巧幫助開發者撰寫出更好的代碼。當寫完這些代碼段之后,我突然意識到,所有的這些代碼段,由于它們的常用性,非常適合用AI輔助編程工具CodeGeeX來自動生成。 下載使用——[CodeGee ......

    uj5u.com 2023-06-17 07:34:08 more
  • 計算機視覺重岸訓議VAlSE2023召開,合合資訊分享智能檔案處理技

    近期,2023年度視覺與學習青年學者研討會 (Vision And Learning SEminar, VALSE) 圓滿落幕。會議由中國人工智能學會、中國圖象圖形學學會主辦,江南大學和無錫國家高新技術產業開發區管理委員會承辦。超五千名專家學者、知名高校師生以及來自OPPO、華為、百度、合合資訊等科... ......

    uj5u.com 2023-06-17 07:33:52 more
  • 自然語言處理 Paddle NLP - 詞法分析技術及其應用

    詞法分析就是利用計算機對自然語言的形態(morphology) 進行分析,判斷詞的結構和類別等。”簡單而言,就是分詞并對每個詞進行分類,包括:分詞、詞性標注、物體識別三個任務 ![image](https://img2023.cnblogs.com/blog/80824/202306/80824-2 ......

    uj5u.com 2023-06-17 07:32:57 more
  • 做一個“20倍程式員”

    以前有一個詞叫“十倍程式員”,形容一個程式員效率高,一個頂十個。 現在隨著ChatGPT的爆火,我覺得可以膽子大一點,改叫“二十倍程式員”。 我是一名十幾年的老程式員,最近在學習ChatGPT,也是ChatGPT的重度用戶,已經用上癮了。 接下來我分享一下的日常用法,大家看看是否能提高效率。 一、向 ......

    uj5u.com 2023-06-17 07:32:27 more
  • Node.js 開發常用到的庫和插件工具,同事看到后也悄悄收藏了……

    Node.js是一個功能強大,并且非常流行的 JavaScript 運行時環境,使開發人員能夠高效率的構建高性能應用程式。下面介紹了8個常見的應用程式開發中用到的庫和函式,可以用于快取資料、操作日期、處理影像、發送電子郵件、發出 HTTP 請求、記錄請求和回應、壓縮資料和哈希密碼等。通過使用這些庫, ......

    uj5u.com 2023-06-17 07:32:21 more
  • 5 Amazing AI Projects, Open Source !

    過去一周,AI大模型的快速演進仍然在繼續上演。今天繼續介紹GitHub上的一些實用的大模型開源專案。 **1. ChatGLM-6B:Open Source ChatGPT Alternative** ChatGLM-6B是一個基于GLM架構的開源對話語言模型,支持中英雙語,有62億引數。結合模型量 ......

    uj5u.com 2023-06-17 07:32:17 more
  • 視頻編碼耗時長、編碼幀發送失敗…DVPP視頻編碼問題典型案例分析

    摘要:本期就分享幾個關于DVPP視頻編碼問題的典型案例,并給出原因分析及解決方法 本文分享自華為云社區《DVPP媒體資料處理視頻編碼問題案例》,作者:昇騰CANN。 DVPP(Digital Vision Pre-Processing)是昇騰AI處理器內置的影像處理單元,通過AscendCL媒體資料 ......

    uj5u.com 2023-06-17 07:32:07 more