2. Understanding Testing in Apex
Testing is the key to successful long term
development
critical component of the development process.
salesforce.com strongly recommends to use a testdriven development process
Test development that occurs at the same time as
code development.
3. Before deploy or upload the code or
package..
75% of your Apex code must be covered by unit tests
All the tests must complete successfully
Every trigger has some test coverage (1%)
All classes and triggers must compile successfully
4. What to test?
Single Action
Test to verify that a single record produces the correct, expected
result.
Bulk Action
test not only the single record case, but the bulk cases as well
Positive Behavior
verify that the expected behavior occurs through every
expected permutation
Negative Behavior
Verify that the error messages are correctly produced
Restricted User
Test whether a user with restricted access to the sObjects used
in your code sees the expected behavior
5. Test Class
Test classes defined by @isTest annotation
Before Winter 12 Release
Test classes have to be private
On Winter 12 Release
Test Classes can be public or private
6. Test Class cont.
Public Test Classes
Expose common methods for test data creation
Setting up data that the tests need to run against.
Methods of a public test class can only be called
from a running test
Cannot be called by a non-test request
7. Test Class cont.
When you create a test method,
Use static
Use testMethod keyword
Use void return type
No any arguments
No data changes performed in a test method
Dont send emails
Cannot be used to test Web service callout
The API for asynchronous test runs is a Beta release (Winter 12)
For More : Force.com Apex code Developers Guide Page 153
8. Test Class cont.
The key methods to use in your unit tests are
the system.assert() methods
System.assert(condition)
System.assertEquals(x,y)
System.assertNotEquals(x,y)
For the security review, every test method
must have at least one system.assert()
method
9. Structure of Test class
@isTest
private classTest_class
{
public static testMethod void test_name()
{
//code_block;
}
}
10. Structure of public Test class for test data
creation
@isTest
public class TestUtil
{
public static void createTestAccounts()
{
// Create some test accounts
}
public static void createTestContacts()
{
// Create some test contacts
}
}
11. New IsTest(OnInstall=true) Annotation
Control the Apex test classes during the package installation
Can be used for managed or unmanaged packages
No longer possible to bypass a failing test during package
installation
A test method or a class won't be executed during installation
Doesn't have this annotation
Annotated with isTest(OnInstall=false)
Annotated with isTest
This annotation applies only to packages uploaded in Winter
12 or later
12. IsTest(OnInstall=true) Annotation
cont
public class OnInstallClass
{
public void method1()
{
// Some code
}
// This test method will be executed during the installation of the
// package.
@isTest(OnInstall=true)
static void test1()
{
// Some test code
}
// Tests excluded from running during the installation of a package.
@isTest
static void test2()
{
// Some test code
}
static testmethod void test3()
{
// Some test code
}
}
13. Best Practice for Writing Test Classes
Write fully portable tests
You write tests in the context of a Developer or Sandbox org.
You can write tests that rely on specific pieces of data
If you do that, your tests will fail on deployment
Use relative URLs and query for names of data records rather than
their specific Ids.
Dont use production data in your tests
Test expected behavior first, then unexpected behavior
Start with testing simple cases, and test to make sure that what you
expect to happen is indeed happening.
Then make sure to add test cases for behavior you dont expect, but
could happen.
This is why they tell developers never to write their own tests, because
we all believe our code will behave as expected.
14. Best Practice for Writing Test Classes cont..
If you find a bug, write a test to expose it before
you fix it
Shoot for 100% coverage
Try to test everything
Its not always fun or even possible, but try
Dont rely on Today()
If you are using dates in your code, dont build your
dates on Today()
Use Date.newInstance(Integer year,Integer
month,Integer date)
Use a date in the past