This blog will explore test class best practices in Salesforce, covering everything from basic principles to advanced techniques that can enhance your testing strategy.
First and foremost, test classes in Salesforce are essential for ensuring the reliability and performance of your customizations and applications on the platform.
Moreover, writing efficient and effective test classes helps maintain code quality and ensures that your deployments and updates are smooth and error-free.
Why Test Classes Matter
Test classes are a critical component of the Salesforce development lifecycle. They ensure that your code behaves as expected and help identify and fix bugs early in the development process.
Moreover, Salesforce requires that at least 75% of your Apex code is covered by tests before you can deploy it to production, making it crucial to adhere to best practices in test writing.
What is the syntax of the Test class
Following is the basic syntax of test classes
Following are the best practices that we can follow while writing our test classes
1. Build the foundation of test classes
First and foremost, a test class is always marked with @istest annotation. Each test method within the class should be static and void, meaning they don’t return any values.
We should also use the TestSetup method to create a common set of data that can be utilised in the whole class. This approach reduces redundancy and ensures consistency across your tests. Below is the syntax for setup method
2. Create meaningful data for the test classes
We should always create meaningful data for our test classes as it helps us to unit test our application covering all the possible scenarios. We should not rely on the existing org data. Here let’s take an example
Suppose I have a contact who is inserting and then we are updating its related account active field to ‘Yes’. Let’s create it test class. There is a contact trigger which will execute after the insertion of the contact and calling our helper class DemoClass.
DemoClass.apxc
DemoClassTest.apxc
Let’s hit the Run Test button appearing on the Test class to run our the test class. Below are the output. Here blue lines in the original class show the covered lines. So, we can see all the lines our covered and the coverage is 100%
3. Use the Test Data Factory class
Consider creating a test data factory class to generate test data. This class can centralize the creation of test records, making your test classes cleaner and easier to maintain. Below is an example of how we can create and use the test data factory class.
TestDataFactory.apxc
4. Testing each conditional logic
Testing each conditional logic is good practice as it will check each scenario and also help us cover and increase code coverage. Below is a sample of updating the account active field depending on the industry.
5. Use Test.starTest and Test.stopTest block
Test.startTest gives us the extra set of governor limits to test our code and Test.stopTest returns to its previous governor limit. Also, we should always test our asynchronous method in this block as they behave as synchronous.
Below is the sample code for the asynchronous apex class and its test class.
QueueableDemoClass.apxc
QueueableDemoTest.apxc
6. Always aim for 90+ code coverage
While Salesforce requires 75% code coverage, aiming for 100% ensures that every line of code is tested. However, coverage alone is not enough; we must also assert that our code behaves as expected. We should cover possible scenarios to test.
7. Use proper assertions in the test class
Use the System.assert methods to verify that your code returns the expected results. Assertions are critical for validating the behaviour of your code under various conditions.
8. Always test in bulk
Ensure our code can handle bulk operations by testing with large data volumes. This practice helps identify issues related to governor limits and performance.
9. Enforce record sharing in test class
To enforce record sharing in our test classes we should use System.runAs(u) where u is the user object which contains the specific user details. Also, it will be beneficial to avoid mixed DML errors in our test classes.
10. Test the classes in your application individually
We should never test the entire application. If we are running many tests then we should test the classes in our organization individually in the Salesforce user interface instead of using the Run All Tests button to run them all together.
Things to remember while writing test classes
- All apex classes must have their test classes and they should cover at least 75% of your apex code.
- All Apex triggers must have some code coverage.
- Don’t just focus on the code coverage, make sure to cover the use cases of the application for both positive and negative.
- If the code uses conditional logic (including ternary operators), execute each branch.
- Complete successfully without any exceptions, unless those exceptions are expected, make sure to handle those in a try-catch block.
FAQs
1. What is @isTest(SeeAllData=true) annotation does?
By using this annotation we will be able to test with our org’s data. However, it is not a good practice to use this. We should always use @isTest(SeeAllData=false).
2. What does @TestVisible annotation do?
This annotation is used to test private methods as these are not accessible outside the class.
2. Why is it important to avoid hard-coded IDs in test classes?
Hard-coded IDs can vary between environments, making tests unreliable. Query for necessary records dynamically within your tests instead.
Conclusion
Adhering to test class best practices in Salesforce is crucial. It helps maintain code quality, ensure smooth deployments, and meet Salesforce’s code coverage requirements.
To start, you can build robust and reliable Salesforce applications by creating meaningful test data. Next, focus on coverage and assertions. Additionally, isolate tests and test bulk and edge cases. Furthermore, leverage mocking frameworks and integrate continuous testing.
Implementing these test class best practices in Salesforce will improve your development workflow. Moreover, it will also provide greater confidence in the stability and performance of your solutions.
By following these test class best practices in Salesforce, we will be well-equipped to write efficient and effective test classes. Ultimately, this will ensure the long-term success of your Salesforce projects.