テストの例
次の例では、下記の種類のテストのケースについて示します。
単純なマイル追跡アプリケーションでテストを実行します。アプリケーションの既存のコードは、1 日に入力されるマイル数が 500 マイルを超えないことを確認します。主オブジェクトは Mileage__c というカスタムオブジェクトです。全体のテストクラスを次に示します。次のセクションでは、コードの特定の部分の手順を説明します。
1@isTest
2private class MileageTrackerTestSuite {
3
4 static testMethod void runPositiveTestCases() {
5
6 Double totalMiles = 0;
7 final Double maxtotalMiles = 500;
8 final Double singletotalMiles = 300;
9 final Double u2Miles = 100;
10
11
12 //Set up user
13 User u1 = [SELECT Id FROM User WHERE Alias='auser'];
14
15 //Run As U1
16 System.RunAs(u1){
17
18
19 System.debug('Inserting 300 miles... (single record validation)');
20
21 Mileage__c testMiles1 = new Mileage__c(Miles__c = 300, Date__c = System.today());
22 insert testMiles1;
23
24 //Validate single insert
25 for(Mileage__c m:[SELECT miles__c FROM Mileage__c
26 WHERE CreatedDate = TODAY
27 and CreatedById = :u1.id
28 and miles__c != null]) {
29 totalMiles += m.miles__c;
30 }
31
32 System.assertEquals(singletotalMiles, totalMiles);
33
34
35 //Bulk validation
36 totalMiles = 0;
37 System.debug('Inserting 200 mileage records... (bulk validation)');
38
39 List<Mileage__c> testMiles2 = new List<Mileage__c>();
40 for(integer i=0; i<200; i++) {
41 testMiles2.add( new Mileage__c(Miles__c = 1, Date__c = System.today()) );
42 }
43 insert testMiles2;
44
45 for(Mileage__c m:[SELECT miles__c FROM Mileage__c
46 WHERE CreatedDate = TODAY
47 and CreatedById = :u1.Id
48 and miles__c != null]) {
49 totalMiles += m.miles__c;
50 }
51
52 System.assertEquals(maxtotalMiles, totalMiles);
53
54 }//end RunAs(u1)
55
56
57 //Validate additional user:
58 totalMiles = 0;
59 //Setup RunAs
60 User u2 = [SELECT Id FROM User WHERE Alias='tuser'];
61 System.RunAs(u2){
62
63 Mileage__c testMiles3 = new Mileage__c(Miles__c = 100, Date__c = System.today());
64 insert testMiles3;
65
66 for(Mileage__c m:[SELECT miles__c FROM Mileage__c
67 WHERE CreatedDate = TODAY
68 and CreatedById = :u2.Id
69 and miles__c != null]) {
70 totalMiles += m.miles__c;
71 }
72 //Validate
73 System.assertEquals(u2Miles, totalMiles);
74
75 } //System.RunAs(u2)
76
77
78 } // runPositiveTestCases()
79
80 static testMethod void runNegativeTestCases() {
81
82 User u3 = [SELECT Id FROM User WHERE Alias='tuser'];
83 System.RunAs(u3){
84
85 System.debug('Inserting a record with 501 miles... (negative test case)');
86
87 Mileage__c testMiles3 = new Mileage__c( Miles__c = 501, Date__c = System.today() );
88
89 try {
90 insert testMiles3;
91 } catch (DmlException e) {
92 //Assert Error Message
93 System.assert( e.getMessage().contains('Insert failed. First exception on ' +
94 'row 0; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, ' +
95 'Mileage request exceeds daily limit(500): [Miles__c]'),
96 e.getMessage() );
97
98 //Assert field
99 System.assertEquals(Mileage__c.Miles__c, e.getDmlFields(0)[0]);
100
101 //Assert Status Code
102 System.assertEquals('FIELD_CUSTOM_VALIDATION_EXCEPTION' ,
103 e.getDmlStatusCode(0) );
104 } //catch
105 } //RunAs(u3)
106 } // runNegativeTestCases()
107
108
109} // class MileageTrackerTestSuiteポジティブテストケース
上記のコードの、単一レコードおよび複数レコードのポジティブテストケースの手順は、次のとおりです。
- デバッグログにテキストを追加して、コードの次のステップを示します。
1System.debug('Inserting 300 more miles...single record validation'); - Mileage__c オブジェクトを作成し、データベースに挿入します。
1Mileage__c testMiles1 = new Mileage__c(Miles__c = 300, Date__c = System.today() ); 2insert testMiles1; - 挿入されたレコードを返してコードを検証します。
1for(Mileage__c m:[SELECT miles__c FROM Mileage__c 2 WHERE CreatedDate = TODAY 3 and CreatedById = :createdbyId 4 and miles__c != null]) { 5 totalMiles += m.miles__c; 6 } -
system.assertEquals メソッドを使用して、期待どおりの結果が返されたことを確認します。
1System.assertEquals(singletotalMiles, totalMiles); - 次のテストに移る前に、合計マイル数を 0 に再設定します。
1totalMiles = 0; - 200 レコードの一括挿入を作成して、コードを検証します。まず、デバッグログにテキストを追加し、コードの次のステップを示します。
1System.debug('Inserting 200 Mileage records...bulk validation'); - 次に 200 件の Mileage__c レコードを挿入します。
1List<Mileage__c> testMiles2 = new List<Mileage__c>(); 2for(Integer i=0; i<200; i++){ 3testMiles2.add( new Mileage__c(Miles__c = 1, Date__c = System.today()) ); 4 } 5insert testMiles2; -
System.assertEquals を使用して、期待どおりの結果が返されたことを確認します。
1for(Mileage__c m:[SELECT miles__c FROM Mileage__c 2 WHERE CreatedDate = TODAY 3 and CreatedById = :CreatedbyId 4 and miles__c != null]) { 5 totalMiles += m.miles__c; 6 } 7 System.assertEquals(maxtotalMiles, totalMiles);
ネガティブテストケース
上記のコードのネガティブテストケースの手順は、次のとおりです。
-
runNegativeTestCases という静的テストメソッドを作成します。
1static testMethod void runNegativeTestCases(){ - デバッグログにテキストを追加して、コードの次のステップを示します。
1System.debug('Inserting 501 miles... negative test case'); - 501 マイルの Mileage__c レコードを作成します。
1Mileage__c testMiles3 = new Mileage__c(Miles__c = 501, Date__c = System.today()); -
insert ステートメントを try/catch ブロック内に配置します。これで、検証の例外を捕捉し、生成されたエラーメッセージを表示できます。
1try { 2 insert testMiles3; 3 } catch (DmlException e) { -
System.assert および System.assertEquals を使用してテストを実行します。次のコードを、前に作成した catch ブロックに追加します。
1//Assert Error Message 2 System.assert(e.getMessage().contains('Insert failed. First exception '+ 3 'on row 0; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, '+ 4 'Mileage request exceeds daily limit(500): [Miles__c]'), 5 e.getMessage()); 6 7//Assert Field 8 System.assertEquals(Mileage__c.Miles__c, e.getDmlFields(0)[0]); 9 10//Assert Status Code 11 System.assertEquals('FIELD_CUSTOM_VALIDATION_EXCEPTION' , 12 e.getDmlStatusCode(0)); 13 } 14 } 15}
セカンドユーザとしてのテスト
上記のコードを、セカンドユーザとして実行する手順は次のとおりです。
- 次のテストに移る前に、合計マイル数を 0 に再設定します。
1totalMiles = 0; - 次のユーザを設定します。
1User u2 = [SELECT Id FROM User WHERE Alias='tuser']; 2 System.RunAs(u2){ - デバッグログにテキストを追加して、コードの次のステップを示します。
1System.debug('Setting up testing - deleting any mileage records for ' + 2 UserInfo.getUserName() + 3 ' from today'); - 次に 1 件の Mileage__c レコードを挿入します。
1Mileage__c testMiles3 = new Mileage__c(Miles__c = 100, Date__c = System.today()); 2insert testMiles3; - 挿入されたレコードを返してコードを検証します。
1for(Mileage__c m:[SELECT miles__c FROM Mileage__c 2 WHERE CreatedDate = TODAY 3 and CreatedById = :u2.Id 4 and miles__c != null]) { 5 totalMiles += m.miles__c; 6 } -
system.assertEquals メソッドを使用して、期待どおりの結果が返されたことを確認します。
1System.assertEquals(u2Miles, totalMiles);