apex
2017年03月31日
【Salesforce】Apexテストクラス関連に関する俺メモだゼイ!
まー、マー、まー。
何というか、初心というか、振り返りだゼイ。
んでもって、テストクラスについてだゼイ。
テストクラスのは下記やればとりあえず実装可能だゼイ。
Apex テスト:trailhead
トレイルヘッドいいゼイ。
やってると結構勉強になるゼイ。
ちなみに、下記を読めばテストクラスについてはほぼ理解でき、実装もできるゼイ。
Apex のテスト
すでに実装経験があるデベの方は、下記読むと理解度が深くなるよー(俺もちゃんとよめー)
効率よく実装できるようになる。(デベロッパーなら流し読みでも十分だゼイ)
■単体テストの組織データとテストデータの分離とか(これ結構影響するよ)
■テスト設定メソッドの使用とか(時間節約だゼイ)
■テストデータ作成用の共通テストユーティリティクラスとか(これね、意識して実装するとあとあと楽だねー)
そして下記は、実装中のおもった、注意点というかコツ?的な、あるある的なもんだゼイ。
あくまで俺的なlogだゼイ。
------------------------------
まずは、基本だゼイ。
・組織にデータを参照しないように
SeeAllData=trueはテストデータ作成しなくて良いが、デプロイ時にエラーが出る可能性が高いため
SeeAllData=falseを利用し、テスト用の関連データを作成する。
------------------------------
これね、
第二、第三フェーズとか開発が進んだあたりで、カスタム設定作成すると過去のテストクラスにも影響するんだゼイ。
・カスタム設定を使用しているときは、忘れずデータを用意する
そのまま使用するとnullになるよー。
テストクラスで作成するデータは、標準オブジェクト、カスタムオブジェクトだけでなくカスタム設定のデータも必要
例)
// カスタム設定の初期化
CustomSetting__c setting = new CustomSetting__c();
setting.Item__c = 'テストテスト';
insert setting;
------------------------------
もう、いやん。ハードコーディンは嫌よ。
意外にやってるコード見かけるゼイ。
・idなどのハードコーディングはNG
NG例)
List exsists = [Select Id From CustomObject__c Where ID='a0S000000000004XVC']; // NG!
実装した組織はOKだけど、デプロイ先には、そのIDはない(ある場合もある)
よく、ハードコーディングされるのを見かけるのが下記
・レコードのsfid
・レコードタイプのsfid
・プロファイルIDなど
------------------------------
昔はなかったが、最近?かなよくでるゼイ。
・テストクラス実行時にエラーになる場合
テスト単体だとうまくいくんだけど、複数のテストと同時に実行すると失敗する場合は
(UNABLE_TO_LOCK_ROWのエラー)
テスト実行オプションの「並列 Apex テストを無効化」するとでなくなる。
------------------------------
昔超はまったーゼイ。
・トリガー無効にする場合
トリガーを無効にする場合は、テストクラスの修正も必要になる
テストクラスはトリガーが動いている状態をカバーしているため
トリガーが無効(動かない状態)になっている状態をカバーする必要がある。
------------------------------
英語かよって、一人突っ込みしちゃったゼイ。
グローバルだねー。テストクラスの実装言語も指定しないとねー。
・テスト実行者の言語によって動きが変わる。
言語に依存した書き方。
例ね
テスト実行者の言語が、日本語の場合
OK
Profile profiles = [select Id From Profile where Name = '標準ユーザ' limit 1];
NG
Profile profiles = [select Id From Profile where Name = 'Standard User' limit 1];
テスト実行者の言語が、英語の場合
NG
Profile profiles = [select Id From Profile where Name = '標準ユーザ' limit 1];
OK
Profile profiles = [select Id From Profile where Name = 'Standard User' limit 1];
------------------------------
オプションうまく使おうゼイ。
・テスト実行のオプションがあるよ。
[開発]-[Apexテスト実行]-[オプション]
オプションを有効に使おう
------------------------------
大き目の開発、複数人で開発するときは注意だゼイ。
ひっかかると一気に生産性が落ちちゃうん。。
・エクリプスなどのツール経由で、テストしまくるとAPIコールが足りなくなる。
複数人で、テストクラスを実装中によく起きるため注意。
------------------------------
これね、開発引き継いだときとか、結構助かった思い出があるーゼイ。
・@TestVisibleを利用するとprivateクラスメンバー変数とprivateメソッドにアクセル可能
下記参考
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_testvisible.htm
------------------------------
うまく使おうよー。
・Test.isRunningTestテスト実行時に特定のコードを実行させないようにすることができる
たまに使う程度。
//テストクラス実行時には、下記を通さない
if (!Test.isRunningTest()) {
}
------------------------------
ほんとだめだよー。ほんとだよ。だめだよ。ダメだゼイ。
・ダミーコードはNG
コードを増やし、強制的にカバー率上げる方法。
例)
public class test (){
public test(){
String testStr = 'test';
testStr = 'test';
testStr = 'test';
testStr = 'test';
testStr = 'test';
testStr = 'test';
}
}
ばれたら大変なことになるよ。
というか、低品質でバグ、トラブルの元なので、NG。
緊急対応だったらしょうがないかもしれないが、後から絶対に直すこと!
------------------------------
意外に使うことが多いゼイ。
・csv読み込み用ののバイナリデータ作成例と添付ファイル作成例
//csvファイルの元作成
String body = '列1,列2,列3,列4,列5';
body += '\n';
body += 'aaa,iii,uuu,eee';
body += '\n';
body += '123,456,789,012';
body += '\n';
body += 'qqq,www,eee,rrr';
body += '\n';
//バイナリデータ
Blob csvFileBody = Blob.valueOf(body);
// 添付ファイルに登録
Attachment attachment = new Attachment();
attachment.Name = 'Test.csv'; // ファイル名
attachment.Body = csvFileBody; // 本文
attachment.ParentId = 【関連先のsfid】;
insert attachment;
------------------------------
はい、以上じゃないよー。
まだまだあるが(振り返りする時間がたりない。。)、一旦ここまでだゼイ。
随時アップデートしていきたいゼイ。
ふりかえり、大事だね。
ほんと苦手というかね、自分を見るのがこわかったりしてー。
桜も散って、次は夏か。
その前に梅雨か。
あした洗車いこうーっと。
2015年02月09日
2014年10月02日
【saleforce】【Apex】トリガでエラーだゼイ。read-only!!
へい、read-only!!
久々であったエラーだゼイ。
このメッセージ。
「System.FinalException: Record is read-only」
トリガーの「after insert」でレコードに対して更新しようとして発生したゼイ。
間違ってupdateかけちゃったんだよね。
やっちゃだめよ。
このページを同じことやってたゼイ。
System.FinalException: Record is read-only: [duplicate]
対象のレコードを更新する場合は、afterではなくbeforceで値を設定だゼイ。(updateしちゃだめよ)
または、afterでする場合は、queryをかけなおすしかないかな。
ってことで、トイレ行ってくる。
これは、げりっぽいな。
うーん、腹の調子がわるいなー。