Good tests do the following:
- Cover as many lines of code as possible. Before you can deploy Apex or
package it for the Salesforce AppExchange, the following must be true.
- If code uses conditional logic (including ternary operators), execute each branch.
- Make calls to methods using both valid and invalid inputs.
- Complete successfully without throwing any exceptions, unless those errors are expected
and caught in a try…catch block.
- Always handle all exceptions that are caught, instead of merely catching the
exceptions.
- Use System.assert methods to prove that code
behaves properly.
- Use the runAs method to test your application
in different user contexts.
- Exercise bulk trigger functionality—use at least 20 records in your tests.
- Use the ORDER BY keywords to ensure that the
records are returned in the expected order.
- Not assume that record IDs are in sequential order.
Record IDs are not created in
ascending order unless you insert multiple records with the same request. For example,
if you create an account A, and receive the ID 001D000000IEEmT, then create account B, the ID of account B may, or may not
be sequentially higher.
- Set up test data:
- Create the necessary data in test classes, so the tests do not have to rely on data
in a particular organization.
- Create all test data before calling the Test.startTest method.
- Since tests don't commit, you don't have to delete any data.
- Write comments stating not only what is supposed to be tested, but the assumptions the
tester made about the data, the expected outcome, and so on.
- Test the classes in your application individually. Never test your entire application in
a single test.
If you are running many tests, test the classes in your organization
individually in the Salesforce user interface instead of using the Run All
Tests button to run them all together.
Best Practices for Parallel Test Execution
Tests that are started from the Salesforce user interface (including the Developer Console)
run in parallel. Parallel test execution can speed up test run time. Sometimes, parallel
test execution results in data contention issues, and you can turn off parallel execution in
those cases. In particular, data contention issues and
UNABLE_TO_LOCK_ROW errors can occur in the following cases:
- When tests update the same records at the same time. Updating the same records
typically occurs when tests don’t create their own data and turn off data
isolation to access the organization’s data.
- When a deadlock occurs in tests that are running in parallel and that try to create
records with duplicate index field values. A deadlock occurs when two running tests are
waiting for each other to roll back data. Such a wait can happen if two tests insert
records with the same unique index field values in different orders.
You can prevent receiving those errors by turning off parallel test execution in the
Salesforce user interface:
- From Setup, enter Apex Test.
- Click Options....
- In the Apex Test Execution Options dialog, select Disable Parallel Apex
Testing and then click OK.
Test classes annotated with IsTest(isParallel=true)
indicate that the test class can run concurrently with more than the default number of
concurrent test classes. This annotation overrides default settings.