Salesforce開發(fā)教程(三)

今天這篇是延續(xù)Salesforce開發(fā)教程(一)诅岩、Salesforce開發(fā)教程(二)的內(nèi)容,對之前沒涉及到的主題進(jìn)行的補充带膜。主要包括Unit Test吩谦、Batch、Schedule Job膝藕、Rest和Soap相關(guān)內(nèi)容式廷。

測試類

當(dāng)我們寫完某個功能的時候,怎么能夠保證自己寫的代碼正常運行起來呢芭挽?大家可能會說測試一下就可以了滑废,那是不是這樣子呢?其實測試分為單元測試袜爪、集成測試蠕趁、功能測試,從前到后分別對應(yīng)著三個階段辛馆,這里的測試類指的是單元測試俺陋,為了能夠讓集成測試和功能測試順利的運行起來,作為開發(fā)者昙篙,應(yīng)該能夠保證單元測試正常運行倔韭,保證函數(shù)方法是沒問題的,后面的集成瓢对、功能測試才能正常順利進(jìn)行;換句話說胰苏,之所有單元測試這么重要硕蛹,是為了能夠?qū)⒋a問題提前暴露出來醇疼,盡早的解決。所以我們應(yīng)該除了將功能開發(fā)完成后法焰,還需要通過測試類來驗證功能是否完整秧荆;除此以外Salesforce會要求代碼的單元測試覆蓋率達(dá)到75%以上,所以單元測試的重要性就不言而喻了埃仪。下面我們來看看在Salesforce中怎樣進(jìn)行單元測試乙濒?
單元測試的語法很簡單:

@isTest 
static void testName() {
    // code
}

這是一個單元測試方法,需要將這個方法放到下面的Class中:

@isTest
private class MyTestClass {
    @isTest 
     static void testName() {
        // code
    }
}

簡單可以簡測試類的過程分為三個步驟:

  • 準(zhǔn)備數(shù)據(jù)
    這里的數(shù)據(jù)指的是運行測試類數(shù)據(jù)卵蛉,每當(dāng)測試類運行完成后颁股,數(shù)據(jù)庫的數(shù)據(jù)會被回滾,不必?fù)?dān)心測試類中修改的數(shù)據(jù)影響到數(shù)據(jù)庫傻丝。這里注意提倡測試類用到的數(shù)據(jù)應(yīng)該避免依賴于某個組織(不建議使用SeeAllData=true標(biāo)注)甘有;推薦你使用@testSetup申明setup方法準(zhǔn)備數(shù)據(jù);另外需要注意的是葡缰,Salesforce有一些系統(tǒng)限制是難以避免的(比如Soql 101 錯誤)亏掀,出現(xiàn)這樣的錯誤后,需要優(yōu)化一下Soql和DML操作泛释。
  • 調(diào)用要測試的類
    實例化需要測試的Class滤愕,調(diào)用相應(yīng)的方法就可以了;注意的是除了正向測試怜校,還應(yīng)該進(jìn)行反向功能測試间影,從而提高代碼的健壯性。
  • 斷言方法輸出的內(nèi)容是否和預(yù)期的一致
    每次運行測試類方法都應(yīng)該進(jìn)行assert韭畸,從而保證要驗證的方法是沒有問題的宇智;建議每個測試方法至少包含一個assert語句。

今天給大家準(zhǔn)備了一個寫Unit Test的模板胰丁,可以參考使用:

@isTest
private class MyTestClass {//Class申明為Private且名字應(yīng)該能夠識別出測試的類
    @testSetup
    static void setUp(){
        //code 準(zhǔn)備數(shù)據(jù)随橘,DML操作應(yīng)該在這個方法里面完成
    }
    @isTest 
    static void myMethodTest() {//Method名稱應(yīng)該能夠識別出測試的功能
        Test.startTest();
        System.assert(xxx);
        Test.stopTest();
        System.assert(xxx);//每個測試方法照燒包含一個assert語句
    }
}

如果你對UT還想有更多的思考和實踐,希望我之前寫過的一篇Mock Framework For Unit Test可以幫助到你锦庸。

Batch和Schedule Job

針對Batch相信大家不會陌生机蔗,一句話概括呢,就是用來處理數(shù)據(jù)量大的場景甘萧;為什么我們要用Batch萝嘁,而不使用普通的類呢,總結(jié)了一下扬卷,Batch大概有下面三個優(yōu)點:

  • 可以提高Salesforce的系統(tǒng)限制牙言,普通Class的Soql的每個事務(wù)查詢次數(shù)是100次,而用Batch可以達(dá)到200次怪得;其次是數(shù)據(jù)量的大小咱枉,普通Class的Soql查詢數(shù)據(jù)上限是50 000卑硫,Batch可以達(dá)到50 000 000。
  • Batch可以批量處理數(shù)據(jù)蚕断,在每次執(zhí)行execute的方法時候欢伏,可以接收任意條數(shù)大小的數(shù)據(jù)量,每個Batch最多可以處理200條數(shù)據(jù)亿乳,意味著你可以將數(shù)據(jù)量分為200一個批次執(zhí)行硝拧。
  • Batch可以和定時任務(wù)結(jié)合在一塊,做一些日常工作葛假,比如系統(tǒng)定期生成任務(wù)或者清理數(shù)據(jù)障陶。

下面我們來看一下怎么寫一個Batch,實現(xiàn)Database.Batchable接口就可以了:
這個接口有三個方法需要實現(xiàn):

  1. 準(zhǔn)備數(shù)據(jù)
    global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}
    這個方法可以返回QueryLocator或者Iterable對象桐款,注意如果用Iterable的話咸这,Soql查詢上限是50 000。
  2. 執(zhí)行邏輯
    global void execute(Database.BatchableContext BC, list< sObject> scope){}
    每個Batch執(zhí)行的時候都會調(diào)用這個方法魔眨。
  3. Finish方法
    global void finish(Database.BatchableContext BC){}
    當(dāng)所有的Batch執(zhí)行完后會調(diào)用媳维,可能會進(jìn)行其他的操作,比如生成日志或者發(fā)送郵件等操作遏暴。

一個簡單Batch的實現(xiàn):

global class MyFirstBatch implements Database.Batchable<sObject> {
    public String query;
    global AddPunishmentInformationOpp(String query) {
        this.query =query;
    }

    global Database.QueryLocator start(Database.BatchableContext bc) {
        return Database.getQueryLocator(query);
    }

    global void execute(Database.BatchableContext BC, list<Sobject> scope) {
        //執(zhí)行語句
    }

    global void finish(Database.BatchableContext BC) {
        //發(fā)送郵件
    }
}

當(dāng)一個Bacth執(zhí)行的時候如果需要用到多個Sobject對象怎么處理呢侄刽?這時候可以嘗試使用** Iterable**定義數(shù)據(jù)范圍,具體實現(xiàn)步驟有三個:

  1. 定義迭代器
global class CustomIterable implements Iterator<SObject>{    
   List<SObject> sobjectList {get; set;} 
   Integer i {get; set;} 
   public CustomCalculateIterable(){ 
       sobjectList = new List<SObject>();
       List<Account> accList = new List<Account>([select id,name from Account]);
       List<Opportunity> oppList = new List<Opportunity>([select id,name from Opportunity]);
       sobjectList.add(accList);
       sobjectList.add(oppList);
       i = 0; 
   }   
   global boolean hasNext(){ 
       if(i >= sobjectList.size()) 
           return false; 
       else 
           return true; 
   }    
   global SObject next(){ 
       // 8 is an arbitrary 
       // constant in this example
       // that represents the 
       // maximum size of the list.
       if(i == 8){ i++; return null;} 
       i=i+1; 
       return sobjectList[i-1]; 
   } 
}
  1. 定義一個Class返回可迭代對象
global class CustomSobjectIterable implements iterable<SObject>{
     global Iterator<SObject> Iterator(){
        return new CustomIterable();
     }
}  
  1. 定義Batch實現(xiàn)類朋凉,調(diào)用上面的CustomSobjectIterable類
global class MyFirstBatch implements Database.Batchable<SObject>{
    global Iterable<Sobject> start(Database.batchableContext info){ 
        return new CustomSobjectIterable();
    }                   
    global void execute(Database.BatchableContext bc,List<SObject> scope){    
        for(SObject so : scope){ 
            String objectType = String.valueof(so.getSObjectType());
            if(objectType == 'Opportunity'){
                //code 
            }
            if(objectType = 'Account'){
                //code 
            }
        }
    }
    global void finish(Database.BatchableContext bc){           
    }
}

到現(xiàn)在為止州丹,我們可以通過實現(xiàn)Batch做了一些事情,那么怎么執(zhí)行Batch呢杂彭?首先明白的是Batch是異步執(zhí)行的墓毒,那么Bacth執(zhí)行完后,可能不會很快的看到結(jié)果亲怠,不過你可以通過Apex Jobs來查看執(zhí)行狀態(tài)所计;Batch執(zhí)行可以在控制臺調(diào)用下面的語句:

MyFirstBatch b = new MyFirstBatch();
database.executeBatch(b);

正如你所看到的,我們可以通過上述語句來調(diào)用Batch团秽,那么我們同樣的可以在Trigger主胧、普通的類方法中來調(diào)用Batch;下面我想著重說一下在定時任務(wù)中調(diào)用Batch习勤,實際項目中常常會有定時發(fā)郵件踪栋、生成日志、清理數(shù)據(jù)的工作图毕,那么這些任務(wù)常常伴隨的數(shù)據(jù)量是比較大的夷都,在Salesforce中只能通過Batch來操作,那怎樣定時來執(zhí)行這個操作呢予颤?有三個步驟:

  1. 定義Scheduler
    想要一個任務(wù)定時執(zhí)行囤官,必須得先實現(xiàn)一個Scheduler類厢破,這個類需要實現(xiàn)Schedulable接口,如下所示:
global class MyFirstScheduler implements Schedulable {
    global void execute(SchedulableContext sc) {
        //code         
    }
}
  1. Scheduler中調(diào)用Batch
global class MyFirstScheduler implements Schedulable {
    global void execute(SchedulableContext sc) {
        Database.executeBatch(new MyFirstBatch);
    }
}
  1. 定義Scheduler執(zhí)行頻率
    Scheduler的執(zhí)行可以通過配置來實現(xiàn)治拿,也可以通過system.schedule方法來實現(xiàn)。

到現(xiàn)在為止笆焰,我們已經(jīng)知道實現(xiàn)Bacth和Scheduler劫谅,并且也在Scheduler中調(diào)用了Batch,這種方式在實際項目中用到的也比較多嚷掠,希望你能會有所收獲捏检。

REST和SOAP

為了能夠與其他系統(tǒng)進(jìn)行集成,Salesforce提供了Rest和Soap兩種API不皆。那么什么是REST?什么是SOAP呢贯城?

  • REST: The Representational State Transfer,這是輕量級的系統(tǒng)集成模式霹娄,所有服務(wù)抽象為可訪問資源能犯,調(diào)用者通過URL就可以和系統(tǒng)發(fā)生交互(增、刪犬耻、改踩晶、查)。
  • SOAP: The Simple Object Access Protocol, 看字面意思是數(shù)據(jù)交互協(xié)議枕磁,用XML定義數(shù)據(jù)格式渡蜻;在使用Web Service的過程中,需要獲取到服務(wù)資源的WSDL(Web Service Description Language)文件计济,然后通過POST請求獲取服務(wù)器應(yīng)答茸苇。

這兩種方式的比較可以參考WebService的兩種方式Soap和Rest比較。如果你想對Salesforce的API想有更多的了解沦寂,推薦大家做一下Lightning Platform API Basics模塊学密;當(dāng)你開發(fā)完接口之后,需要用第三方工具進(jìn)行測試凑队,之前我寫過一篇用使用Postman對Salesforce進(jìn)行接口測試则果,如果要測試SOAP的話,可以使用SOAP UI進(jìn)行驗證漩氨,參考Salesforce中SOAP的實踐西壮。

至此,Salesforce開發(fā)教程系列終于完成了叫惊,從第一篇對Salesforce的入門了解款青,第二篇的開發(fā)實踐,今天這篇內(nèi)容算是對第二篇的補充霍狰;希望通過這個開發(fā)教程系列可以幫助到你抡草,文章中如有問題請盡情指出饰及。再次感謝你的閱讀,感謝支持康震!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末燎含,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腿短,更是在濱河造成了極大的恐慌屏箍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橘忱,死亡現(xiàn)場離奇詭異赴魁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钝诚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門颖御,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凝颇,你說我怎么就攤上這事潘拱。” “怎么了祈噪?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵泽铛,是天一觀的道長。 經(jīng)常有香客問我辑鲤,道長盔腔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任月褥,我火速辦了婚禮弛随,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宁赤。我一直安慰自己舀透,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布决左。 她就那樣靜靜地躺著愕够,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佛猛。 梳的紋絲不亂的頭發(fā)上惑芭,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音继找,去河邊找鬼遂跟。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幻锁。 我是一名探鬼主播凯亮,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哄尔!你這毒婦竟也來了假消?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤岭接,失蹤者是張志新(化名)和其女友劉穎置谦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿傅,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年瘟栖,在試婚紗的時候發(fā)現(xiàn)自己被綠了葵擎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡半哟,死狀恐怖酬滤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寓涨,我是刑警寧澤盯串,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站戒良,受9級特大地震影響体捏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糯崎,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一几缭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沃呢,春花似錦年栓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惰瓜,卻和暖如春否副,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸵熟。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工副编, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓痹届,卻偏偏與公主長得像呻待,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子队腐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,869評論 6 13
  • 很實用的編程英語詞庫蚕捉,共收錄一千五百余條詞匯。 第一部分: application 應(yīng)用程式 應(yīng)用柴淘、應(yīng)用程序app...
    春天的蜜蜂閱讀 1,338評論 0 22
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,791評論 0 11
  • 翻譯自“Collection View Programming Guide for iOS” 0 關(guān)于iOS集合視...
    lakerszhy閱讀 3,830評論 1 22