我在网上找不到任何关于这个问题的可靠信息。但我认为这一定是一个影响很多人的问题。
基本上,我在沙盒中编写了一个简单的触发器和测试类,并对其进行了测试,当一切正常时,我将其部署到PRD。
我先尝试了验证模式,我得到了这个错误。
系统LimitException:SOQL查询太多:101
此错误显示在其他一些测试类中发生。所以我觉得触发器中的测试用例运行了,而这与剩余的测试用例一起不知何故超出了限制。
因此,单元测试中的SOQL查询总数必须少于100。这有点难,对吧?我可以想象,有这么多测试用例,我们肯定需要100多个查询。
那么,由于Salesforce在部署哪怕是一行代码时都会运行所有测试用例,因此有什么方法可以避免达到这一限制呢。
我没有任何常见的嫌疑人...比如for循环中的SOQL。
更新:2012年8月19日:我现在发布测试类和触发器的源代码
测试等级:
@isTest
私有类TestAccountDuplicateWebsiteTrigger{
static testMethod void myUnitTest() {
try{
// TO DO: implement unit test
Test.startTest();
Account a1;
a1 = new Account();
a1.name = 'GMSTest';
a1.Website = 'www.test.com';
Account a2;
a2 = new Account();
a2.name = 'GMSTest2';
a2.Website = 'www.test.com';
Account a3;
a3 = new Account();
a3.name = 'GMSTest3';
a3.Website = 'www.test1.com';
insert a1;
insert a2;
//insert a3;
Test.stopTest();
}
catch (Exception e)
{
}
}
}
触发
trigger osv_unique_website_for_account on Account (before insert, before update) {
//Map which has no duplicates with website as the key
Map<String, Account> accountMap = new Map<String, Account>();
for (Account account: System.Trigger.new)
{
//Ensure that during an update, if an website does not change - it should not be treated as a duplicate
if ((account.Website != null) && (System.Trigger.isInsert ||
(account.Website != System.Trigger.oldMap.get(account.Id).Website)))
{
//check for duplicates among the new accounts in case of a batch
if (accountMap.containsKey(account.Website))
{
account.Website.addError('Cannot save account. Website already exists.');
}
else
{
accountMap.put(account.Website, account);
}
}
}
//Now map containing new account websites has been created.
//Check them against the account websites that ALREADY EXIST in salesforce. If website exists, display error.
for (Account account : [SELECT Website FROM Account WHERE Website IN :accountMap.KeySet()])
{
Account newAccount = accountMap.get(Account.Website);
if (newAccount!=null)
{
newAccount.Website.addError('Cannot save account. Website already exists.');
}
}
}
你能分享一下你的想法吗?
谢谢,
加尔文
另一件需要记住的事情是在for循环中执行的SOQL。您可以在循环之前创建列表并存储查询结果。。这样,您就不会面临调速器限制的问题,因为每个事务只使用一条SOQL语句。
查看一些测试类会有所帮助,但需要注意的一件重要事情是,您需要使用Test.startTest()和Test.stopTest()方法。这个想法是,您为设置测试所做的任何查询或DML操作都应该在Test.startTest()方法之前关闭。然后在测试代码(例如执行您正在测试的方法)时,在开始和停止方法调用之间这样做。
这提供了单元测试上下文。这基本上会忽略在开始和停止测试之外进行的任何dml或查询,并且只计算在这两个测试之间发生的事情作为测试的一部分。否则,所有设置代码和实际测试代码都被视为同一上下文的一部分,因此应计入限值。
此链接应该可以为该主题提供更多信息:http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods
大家好, 我正在尝试为我帮助编写的触发器编写一个测试类。触发器使用名为trigger\u help\u c的字段,该字段是通过添加opportunity Type和Account ID派生的公式字段,如果在过去90天内已在该帐户上创建了该类型的opportunity,则在插入之前激发。除非配置文件是系统管理员。这是我的触发器: 我在写测试课时遇到了困难,我像往常一样不知所措。我写了以下内容,但我不
下面是我的顶点触发器。我是一名初学者,正在尝试编写其测试类,但不断出现错误“System.DmlException:Insert失败。第0行出现第一个异常;第一个错误:REQUIRED\u FIELD\u MISSING,错误:只有在产品相关列表上为此opportunity选择了价格手册,才能选择产品。:[]”。 在Opportunity上触发TrgrOptyHighestCustmorePric
我试图使用testng并行运行测试,但我的配置有一些问题。 我有一个包含许多类文件的项目,每个类文件包含许多测试。 我目前正在使用parallel='methods'标志运行测试,以最大化在给定时间运行的测试数量。 我的目标是避免同一类的测试同时运行,同时最大化并行测试的数量。 因此,给定一个示例xml文件: 给定40个可用线程,我希望在任何给定时间运行40个测试。 我使用了一个方法拦截器来随机化
下面是一个helper函数的代码 基本上,此方法只需使用HttpRequest和HttpResponse调用endpointURL,endpointURL是web服务,在参数中指定的超时之后,它将只返回200。 现在的问题是,我需要编写一个测试用例来涵盖这个方法,但我不知道如何编写它。。我不知道如何正确模拟httpcallout,因为此方法不返回HttpResponse,而且由于代码现在已冻结,我
问题内容: 我正在设置将使用Redis和APCu的PHP标记的缓存实现。由于APC是键值存储,因此我将使用Redis进行键标记关系,并与APC上的每个Web服务器进行同步。 我当前的问题仅涉及Redis。可能您知道实现,但需要明确说明:键可以具有与之关联的标签。在以后的某个时间点,您可以通过某些标签删除缓存的密钥。有很多键,但没有那么多标签,并且键和标签之间存在n对n的关系。 由组成: 因为设置后
我已在Salesforce APEX中记录了触发器。它工作正常。 触发器代码为: 现在我正在尝试为它的测试类编写代码。它在线上给出错误,说对象无法解析为字符串。 测试等级代码为: 期待找到解决方案。任何帮助都将不胜感激。 谢谢