Testing, Debugging, and Deployment Flashcards
ある開発者が、テスト・クラスで @testSetup アノテーションを使用してデータを作成したいと考えています。このアノテーションを使用する際に注意すべき点は何ですか?
答えを 3 つ選んでください。
A. テストデータへの変更は、各テストメソッドの実行終了後にロールバックされます。
B. クラスのどこかに @isTest(SeeAllData=true) というアノテーションが付けられている場合は、このアノテーションを使用できません。
C. 各 Apex テスト・クラスに対して定義できる @testSetup メソッドは 1 つだけです。
D. テストによってデータが削除された場合は、次のテストを実行する前にセットアップ メソッドを再実行する必要があります。
E. テストをさらに実行する前に、@testSetup メソッドを明示的に呼び出す必要があります。
A. テストデータへの変更は、各テストメソッドの実行終了後にロールバックされます。
B. クラスのどこかに @isTest(SeeAllData=true) というアノテーションが付けられている場合は、このアノテーションを使用できません。
C. 各 Apex テスト・クラスに対して定義できる @testSetup メソッドは 1 つだけです。
testSetup アノテーションをクラスで使用できるのは、@isTest アノテーションから (seeAllData=true) オプションが除外されている場合だけです。テスト・クラスで定義できる @testSetup メソッドは 1 つだけで、テスト・メソッドの前に自動的に呼び出されます。フィールドの更新やレコードの削除など、テスト・メソッドによってセットアップ・データに加えられた変更は、次のテスト・メソッドが実行される前に、元のセットアップ状態にロールバックされます。テストメソッド内でテストデータを作成すると、テストメソッドの実行終了後に毎回レコードが削除されるのとは対照的に、テストセットアップ メソッド内で作成されたレコードは、テストクラス全体の実行後にのみ(ロールバックによって)削除されます。この結果、特に複数のテストレコードを扱う場合、テストの実行時間が短縮されます。
ある開発者が、複数のプロファイルに属する複数のユーザーが使用するカスタムアプリケーションのパフォーマンスをプロファイリングしています。計算オーバーヘッドの共有によるパフォーマンスへの影響を判断するために役立つのは、次のうちどれでしょうか。
答えを1つ選んでください。
A. 最高レベルのアクセス権を持つユーザーに対してパフォーマンス・プロファイリングを実施する。
B. 最小レベルのアクセス権を持つユーザーに対してパフォーマンス・プロファイリングを実施する。
C. 異なるプロファイルを持つ複数のユーザーに対してパフォーマンス・プロファイリングを実行する。
D. システム管理者プロファイルを使用してパフォーマンス・プロファイリングを実行する。
C. 異なるプロファイルを持つ複数のユーザーに対してパフォーマンス・プロファイリングを実行する。
異なるロールやプロファイルを持つユーザーを追加することで、パフォーマンス・プロファイリングのステップを反復することは良い習慣である。これは、データ量と共有計算のオーバーヘッドによって引き起こされる可能性のあるパフォーマンスへの影響を判断するのに役立ちます。システム管理者のようなたった一人のユーザーに対してアプリケーションをテストすることは、正確なパフォーマ ンス・プロファイリングに必要な共有関連の計算をシステムが行うことを可能にしません。
ある開発者が Visualforce コードのチューニングを行っています。彼は、開発者コンソールのパフォーマンスツリーを使用して、さまざまな条件で実行されるテストおよび Visualforce コードのチューニング後に実行されるテストのベンチマークとして使用できるメトリックを記録しています。パフォーマンスツリーで提供され、実行ツリーでは提供されない情報は次のうちどれでしょうか?
答えを 3 つ選んでください。
A. Duration in milliseconds
B. Heap percentage
C. Duration percentage
D. Heap size
E. Iterations
B. Heap percentage
C. Duration percentage
E. Iterations
パフォーマンスツリータブでは、リクエストに対して実行された各コンポーネントのミリ秒単位の継続時間、ヒープサイズ、および反復の内訳を提供します。さらに、継続時間のパーセンテージとヒープのパーセンテージを見ることができます。パーセントと反復は実行ツリーでは表示できません。
ある開発者は、テストデータを生成するために既存のユーティリティクラスを更新することで、オポチュニティとその関連する取引先との間の Apex トリガメカニズム用のテストクラスを記述しています。ユーティリティクラスには、テストクラスでは実行されないメソッドが含まれていたため、コードカバレッジの最適化には問題がありました。以下のユーティリティクラスから、開発者はどのようなオプションを考慮すべきでしょうか?
答えを 2 つ選びなさい。
public class MyTestDataFactory { public static void createAccounts(Integer num) { List<Account> records = new List<Account>(); for (Integer i = 1; i <= num; i++) { records.add(new Account(name = 'Test Account ' + i)); } insert records; } public static void createOpportunities(Account acc, String stage, Integer num) { List<Opportunity> records = new List<Opportunity>(); for (Integer i = 1; i <= num; i++) { records.add(new Opportunity(Name=acc.Name + ' Opportunity ' + i, StageName=stage, CloseDate=System.today().addMonths(1), AccountId=acc.Id)); } insert records; } public static void createLeads(Integer num) { List<Lead> records = new List<Lead>(); for (Integer i = 1; i <= num; i++) { records.add(new Lead(LastName='Test Lead ' + i, Company='Test')); } insert records; } public static void createContacts(Integer num, Id accountId) { List<Contact> records = new List<Contact>(); for (Integer i = 1; i <= num; i++) { records.add(new Contact(LastName='Test Contact ' + i, AccountId=accountId)); } insert records; } }
A. isTestでユーティリティ・クラスをアノテートする。
B. データ作成メソッドを新しいユーティリティ・クラスに移動する。
C. isTestUtility でユーティリティ・クラスをアノテートする。
D. データ作成メソッドをトリガーに移動する
A. isTestでユーティリティ・クラスをアノテートする。
B. データ作成メソッドを新しいユーティリティ・クラスに移動する。
テスト・クラスに @isTest を付けると、ユーティリティ・クラスがテスト・ユーティリティ・クラスに変換され、 コード・カバレッジ・パーセンテージの計算から除外されます。ただし、既存のユーティリティ クラスに @isTest が追加されると、テスト以外のコードからは呼び出されなくなり、テスト メソッドでのみ使用されるようになるため、トリガーとなるテスト クラス用に別のテスト ユーティリティ クラスを作成することも考慮する必要があります。
isTestUtility アノテーションはありません。Apex トリガー内部でメソッド(またはクラス)を定義することは可能ですが、メソッドはトリガー内部でしかアクセスできないため、推奨されません。
ある開発者が、「jest」フレームワークを使用して Lightning ウェブコンポーネントのテストファイルを作成しています。彼女は、コンポーネントがロードされたときに要素に表示されるメッセージを検証するために、以下のコードを書きました。追加のユニットテストを記述する前に、各テストの終了時に DOM がリセットされることを確認したいと思います。このユースケースで、コメントの代わりにどのコードブロックを使うことができますか?
// opportunityDataComponent.test.js import { createElement } from 'lwc'; import OpportunityDataComponent from 'c/opportunityDataComponent'; describe('c-opportunity-data-component', () => { // Add code here it('displays title message', () => { const element = createElement('c-opportunity-data-component', { is: OpportunityDataComponent }); document.body.appendChild(element); const title = element.shadowRoot.querySelector('#title'); expect(title.textContent).toBe('Current Opportunities'); }); });
A.
afterEach(() => { while (document.body.firstChild) { document.body.removeChild(document.body.firstChild); } });
B.
afterTest(() => { while (document.body.firstChild) { document.body.removeChild(document.body.firstChild); } });
C.
clear(() => { while (document.body.firstChild) { document.body.removeChild(document.body.firstChild); } });
D.
reset(() => { while (document.body.firstChild) { document.body.removeChild(document.body.firstChild); } });
A.
afterEach(() => { while (document.body.firstChild) { document.body.removeChild(document.body.firstChild); } });
afterEach() メソッドは、テストファイル内の各テストの後で DOM をリセットするために使用します。デフォルトでは、ひとつのテストファイル内でひとつの jsdom インスタンスが共有されます。テストの出力が別のテストに影響を与えないようにするには、 afterEach() メソッドでテスト間のクリーンアップを行うのがベストプラクティスです。このユースケースで使用できる afterTest()、 clear()、 reset() メソッドはありません。
ある開発者が、取引先レコードとユーザレコードを同じテストメソッドで作成しようとしています。しかし、テストを実行すると、混合 DML エラーが返されます。このエラーを防ぎ、開発者がテストメソッド内で両方のタイプの DML 操作を実行できるようにするには、どうすればよいですか?
答えを 2 つ選んでください。
A. 混合 DML 操作を System.runAs ブロックで囲む。
B. future アノテーションを使用してメソッドを作成し、DML 操作の 1 つを非同期に実行する。
C. 混合 DML 操作を Test.startTest() および Test.stopTest() で囲む。
D. User sObject に対して DML 操作を実行する 2 番目のメソッドを作成する。
A. 混合 DML 操作を System.runAs ブロックで囲む。
B. future アノテーションを使用してメソッドを作成し、DML 操作の 1 つを非同期に実行する。
同じトランザクション内で、セットアップ sObject と別の sObject に対する DML 操作を行うことはできません。ただし、System.runAs ブロックで囲むことで、テスト・メソッド内で混在した DML 操作を実行することは可能です。また、@future アノテーションを付けたメソッドを作成し、一方の DML 操作を非同期で実行し、もう一方の DML 操作を元のトランザクションで実行することもできます。
ある開発者は、ApexコードのSOQLクエリによって返された行数を知る必要があります。この情報の概要をすばやく把握するために、次のうちどれを使用できますか。
答えを1つ選びなさい。
A. Execution Log
B. Execution Tree
C. Execution Stack
D. Executed Units
D. 実行ユニット
Execution Overview’の’Executed Units’タブでは、SOQLクエリによって返された行数の概要を素早く見ることができます。実行ログでもこの情報を提供できますが、’Execution Overview’ パネルにアクセスする方が簡単で迅速です。このパネルでは、メソッド、クエリ、ワークフロー、コールアウト、DML 文、検証、トリガ、および Visualforce ページの数に関する情報を提供できます。
ある開発者は、Apexスケジューラを使用して、特定の時間に特定のテストを非同期で実行する必要があります。この要件に使用できるオブジェクトは次のうちどれですか。
答えを2つ選んでください。
A. ApexTestResult
B. ApexTestQueue
C. ApexTestQueueItem
D. ApexTestSuite
A. ApexTestResult
C. ApexTestQueueItem
Apexテストは、ApexTestQueueItemとApexTestResultを使用して非同期で実行できます。テストは、ApexTestQueueItemを使用してApexのジョブキューに追加できます。完了したテストの実行結果は、ApexTestResultを使用して確認できます。
ある開発者が、<apex:commandButton>コンポーネントを使用して、現在のレコードに対して特定のアクションを実行するボタンを Visualforce ページに作成しました。このボタンをユニットテストでテストするにはどうすればよいですか。
答えを1つ選んでください。</apex:commandButton>
A. ボタンに関連付けられているアクションメソッドを直接呼び出します。
B. JavaScript を使ってボタンのクリックアクションをシミュレートする。
C. Test.setCurrentButtonメソッドを使用して、テストするボタンを指定する。
D. ボタンのonclick属性で実行するテストメソッドを指定する。
A. ボタンに関連付けられているアクションメソッドを直接呼び出します。
apex:commandButton コンポーネントに関連付けられたコントローラメソッドは、その action 属性で指定します。Visualforceページのボタンをテストする場合、そのアクションメソッドはユニットテストで直接呼び出されます。
ユニットテストは Apex で記述します。したがって、JavaScript を使用することはできません。onclick属性にはJavaScriptの関数が必要なため、テストメソッドは使用できません。Test.setCurrentButton メソッドはありません。
ある開発者が、外部 Web サービスにコールアウトし、特定の DML 操作を実行する Apex クラスのパフォーマンスをテストしています。実行概要パネルでさまざまなタイプのトランザクションのタイムラインを分析する際に、関連するプラクティスは次のうちどれですか?
答えを2つ選んでください。
A. 実行ログパネルのログ行は、特定のイベントの詳細を分析することができます。
B. 実行ログとともに実行ツリーを使用し、イベントに関する特定の情報をフィルタリングして取得することができる。
C. パフォーマンス・ツリーを使用して、最も時間のかからないものから、さらにイベントを分析する。
D. Apex イベントの複数の短いバーストは、合計するとかなりの時間がかかる可能性があるため、分析する必要があります。
A. 実行ログパネルのログ行は、特定のイベントの詳細を分析することができます。
D. Apex イベントの複数の短いバーストは、合計するとかなりの時間がかかる可能性があるため、分析する必要があります。
実行概要パネルでタイムラインを分析すると、Apexイベントの複数の短いバーストが簡単にかなりの時間になることがあります。これは一般的に非効率なApexループロジックを示しています。パフォーマンス・ツリーは、イベントとその継続時間をトップダウンで表示しますが、最も時間がかかるイベントからイベントを分析するために使用します。パフォーマンス・ツリーは、特定のイベントをフィルタリングして表示するために、実行ログと一緒に使用できます。実行ログ・パネルのログ行は、イベントの詳細を分析できます。
あるSalesforce開発者は、顧客オポチュニティのステージが「契約締結」から「クローズド獲得」に変更された場合に、一連のギフトレコードを生成する機能の構築を依頼されました。Apex テストはサンドボックスで正常にパスしました。本番環境へのデプロイ中、テストのコードカバレッジは0%です。以下のテストクラスを考えると、どのような原因が考えられますか?
@isTest(SeeAllData=true) public class OpportunityTriggerTest { @isTest static void testGifts() { Opportunity opp = [SELECT Id, Account.Id, Account.Recipient_Count\_\_c FROM Opportunity WHERE StageName = 'Contract Signing' LIMIT 1]; opp.StageName = 'Closed Won'; update opp; List<Gift\_\_c> gifts = [SELECT Id, Name FROM Gift\_\_c WHERE Account\_\_r.Id = :opp.Account.Id AND Opportunity\_\_r.Id = :opp.Id]; // check that the correct number of gift items are generated System.assertEquals(gifts.size(), opp.Account.Recipient_Count\_\_c); } }
A. ターゲットの org にテストクラスが必要とするデータがない。
B. アノテーションに isParallel=true が含まれていない。
C. クラスのアノテーションは @isTest(AccessData=true) であるべきです。
D. テストは、System.runAs() を使用してシステム・モードで実行する必要があります。
A. ターゲットの org にテストクラスが必要とするデータがない。
ベストプラクティスとして、テストクラスはそれ自身のテストデータを生成し、テストを実行するために org のデータに依存しないようにします。上のシナリオでは、もしターゲット org に ‘Contract Signing’ というステージを持つ Opportunity レコードがなければ、エラーが発生してテストが終了し、コードカバレッジが 0% になります。
isTest(AccessData=true) は無効です。テストはデフォルトでシステム・モードで実行されるため、System.runAs() を使用する必要はありません。isParallel=true を追加すると、テストが並列実行されるだけです。
開発者は、拡張コントローラの機能をテストする必要があります。以下のコードでは、標準コントローラのインスタンスをテストメソッドで作成しています。
ControllerExtension’がコントローラ拡張クラスの名前である場合、次のコード文のどれが正しいインスタンス化方法でしょうか?
答えを1つ選びなさい。
ApexPages.StandardController sc = new ApexPages.StandardController(acc);
A. ControllerExtension ce = new ControllerExtension();
B. ControllerExtension ce = new ControllerExtension(acc.Id);
C. ControllerExtension ce = new ControllerExtension(sc);
D. ControllerExtension ce = new ControllerExtension(acc);
C. ControllerExtension ce = new ControllerExtension(sc);
コントローラの拡張モジュールは、コントローラの変数を拡張モジュールの コンストラクタのパラメータとして渡すことでインスタンス化されます。この場合は、変数 ‘sc’ をパラメータとして渡します。
あるSalesforce開発者が、Visualforceページ用のカスタムコントローラを作成しました。このコントローラには、execute()というメソッドが含まれており、特定のロジックを実行してPageReferenceオブジェクトを返します。カスタムコントローラを単体テストで「controller」という変数としてインスタンス化する場合、その変数を使用してメソッドをテストする方法を示す選択肢は次のうちどれですか?
A. PageReference pr = Test.setCurrentPage(controller.execute());
B. PageReference pr = ApexPages.currentPage().controller.execute();
C. PageReference pr = controller.execute();
D. PageReference pr = ApexPages.controller.execute();
C. PageReference pr = controller.execute();
カスタムコントローラやコントローラ拡張モジュールでアクションメソッドをテストする場合は、 メソッドを直接コールしてユーザのアクションをシミュレートします。メソッドがPageReferenceを返す場合は、System.assertEquals()とgetUrl()メソッドで検証できます。
その他のオプションには、無効な構文または Apex メソッドの不適切な使用が含まれます。
Webサービスのコールアウトをテストする場合、テスト中に使用するモックレスポンスを指定するには、どのメソッドを呼び出す必要がありますか?
答えを1つ選んでください。
A. Test.setMock()
B. Test.MockResponse()
C. Test.Mock()
D. Test.startMock()
A. Test.setMock()
コールアウトテストの前に Test.setMock() を使って、モックレスポンスを提供するクラスを指定します。このメソッドをコールしないと、テストは失敗します。
コンポーネントがレンダリングされたときにページにテキストが表示されることをテストするために、’WelcomeApp’ という名前の Aura コンポーネントに対してユニットテストが作成されました。しかし、テストを実行すると、document.getElementById(「header」) が null 値を返すというエラーが発生します。しかし、指定された属性idを持つ要素はコンポーネントのマークアップで定義されています。何がこのエラーを引き起こしているのでしょうか?
<!-- WelcomeApp markup: --> <aura:component> <div id="header">Welcome!</div> <div id="content"> <!-- ... --> </div> </aura:component> // WelcomeApp unit test: describe('WelcomeApp tests', function () { it('displays a welcome message', function (done) { $T.createComponent("c:WelcomeApp", {}, false) .then(function (cmp) { let welcomeMessage = document.getElementById("header").textContent; // get the text content of the element expect(welcomeMessage).toContain("Welcome!"); // validate that the text matches an expected string done(); }).catch(function (e) { done.fail(e); }); }); });
A. ユニットテストの実行時に Aura コンポーネントがレンダリングされていません。
B. Lightning テストサービスは document.getElementById() 関数をサポートしていません。
C. T.createComponent 関数が Aura コンポーネントの参照に無効な構文を使用している。
D. document.getElementById() 関数は、コールバックの前に呼び出す必要があります。
A. ユニットテストの実行時に Aura コンポーネントがレンダリングされていません。
Lightning Testing Service には $T Utility オブジェクトが含まれています。このオブジェクトには、コンポーネントを DOM に挿入したり、コンポーネントの属性を定義したりするためのユニットテストで使用するメソッドが含まれています。T.createComponent() メソッドには 3 つのパラメータがあります。最初のパラメータは、作成するコンポーネントを指定するために使用します。二番目のパラメータは、指定したコンポーネントの属性を事前に設定するために使用します。3番目のパラメータをtrueに設定すると、コンポーネントがレンダリングされ、falseに設定するとレンダリングされません。上のコードでは、このパラメータはfalseに設定されています。つまり、コンポーネントはページ上にレンダリングされません。このため、document.getElementById(「header」)はnullを返します。