测试类对于实际的工作来说也是很重要的一环,除了验证当前的功能以外,还有最重要的就是生产环境的trigger以及apex class在部署时,需要验证所对应的测试类的测试覆盖率,salesforce的硬性要求是部署时需要保证最低75%的覆盖率。先看一下部署时可选择的测试类型:
接下来我们看一下测试类的结构。
@isTest
private class HelloWorldTestClass {
//testMethod 目前已经弃用,建议使用 @isTest标签标记此方法为测试方法
// static testMethod void validateHelloWorld() {
@IsTest static void validateHelloWorld() {
Book__c b = new Book__c(Name='Behind the Cloud', Price__c=100);
insert b;
Test.startTest()
b = [SELECT Price__c FROM Book__c WHERE Id =:b.Id];e
System.assertEquals(90, b.Price__c);
Test.stopTest();
}
}
类使用 @isTest标签声明,类使用private;
方法使用@isTest标签声明,方法需要静态类,并且返回类型是void;
使用 Test.startTest以及Test.stopTest;
startTest方法标志着你的测试代码中实际开始的时间点。每个测试方法只允许调用这个方法一次。在这个方法之前的所有代码都应该用来初始化变量,填充数据结构,等等,允许你设置运行测试所需的一切。任何在调用startTest之后、stopTest之前执行的代码都会被分配一套新的Government Limitation。
startTest方法并不刷新测试的上下文:它为你的测试添加了一个上下文。例如,如果你的类在调用startTest之前进行了98次SOQL查询,并且startTest之后的第一个重要语句是一个DML语句,那么现在程序可以进行额外的100次查询。然而,一旦调用stopTest,程序就会回到原来的上下文中,在达到100的限制之前,只能再进行2次SOQL查询。
[optional]使用System.assertEquals等断言,用来确定结果符合你的预期。
需要提出的一点是:不同类型的类,使用test class的方法不同,比如针对 callout,需要有额外的写法,通常test class的写法的步骤为: 1→ 创建数据; 2→ 调用类的方法或者覆盖类的方法;3→断言验证。实际项目中,还会使用 TestDataFactory的工厂类来统一数据的创建,详情可以查看下方链接。
参考文档: