{"id":3780,"date":"2023-12-30T08:43:50","date_gmt":"2023-12-30T00:43:50","guid":{"rendered":"http:\/\/www.ponybai.com\/?p=3780"},"modified":"2023-11-29T08:45:13","modified_gmt":"2023-11-29T00:45:13","slug":"%e6%b5%8b%e8%af%95-apex","status":"publish","type":"post","link":"http:\/\/www.ponybai.com\/?p=3780","title":{"rendered":"\u6d4b\u8bd5 Apex"},"content":{"rendered":"\n<p>Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002<\/p>\n\n\n\n<p>\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u82e5\u8981\u4fdd\u62a4\u6570\u636e\u7684\u9690\u79c1\uff0c\u8bf7\u786e\u4fdd\u6d4b\u8bd5\u9519\u8bef\u6d88\u606f\u548c\u5f02\u5e38 \u8be6\u7ec6\u4fe1\u606f\u4e0d\u5305\u542b\u4efb\u4f55\u4e2a\u4eba\u6570\u636e\u3002Apex \u5f02\u5e38\u5904\u7406\u7a0b\u5e8f\u548c\u6d4b\u8bd5 \u6846\u67b6\u65e0\u6cd5\u786e\u5b9a\u654f\u611f\u6570\u636e\u662f\u5426\u5305\u542b\u5728\u7528\u6237\u5b9a\u4e49\u7684\u6d88\u606f\u4e2d\uff0c\u5e76\u4e14 \u8be6\u3002\u8981\u5728\u81ea\u5b9a\u4e49 Apex \u4f8b\u5916\u4e2d\u5305\u542b\u4e2a\u4eba\u6570\u636e\uff0c\u6211\u4eec\u5efa\u8bae\u60a8 \u521b\u5efa\u4e00\u4e2a Exception \u5b50\u7c7b\uff0c\u5176\u4e2d\u5305\u542b\u4fdd\u5b58\u4e2a\u4eba\u6570\u636e\u7684\u65b0\u5c5e\u6027\u3002\u7136\u540e \u4e0d\u8981\u5728\u5f02\u5e38\u7684\u6d88\u606f\u5b57\u7b26\u4e32\u4e2d\u5305\u542b\u5b50\u7c7b\u5c5e\u6027\u4fe1\u606f\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4e86\u89e3 Apex \u4e2d\u7684\u6d4b\u8bd5<\/strong><\/li>\n\n\n\n<li><strong>\u5728 Apex \u4e2d\u6d4b\u8bd5\u4ec0\u4e48<\/strong><\/li>\n\n\n\n<li><strong>\u4ec0\u4e48\u662f Apex \u5355\u5143\u6d4b\u8bd5\uff1f<\/strong><\/li>\n\n\n\n<li><strong>\u4e86\u89e3\u6d4b\u8bd5\u6570\u636e<\/strong><br>Apex \u6d4b\u8bd5\u6570\u636e\u662f\u6682\u65f6\u6027\u7684\uff0c\u4e0d\u4f1a\u63d0\u4ea4\u5230\u6570\u636e\u5e93\u3002<\/li>\n\n\n\n<li><strong>\u8fd0\u884c\u5355\u5143\u6d4b\u8bd5\u65b9\u6cd5<\/strong><br>\u82e5\u8981\u9a8c\u8bc1 Apex \u4ee3\u7801\u7684\u529f\u80fd\uff0c\u8bf7\u6267\u884c\u5355\u5143\u6d4b\u8bd5\u3002\u60a8\u53ef\u4ee5\u5728\u5f00\u53d1\u4eba\u5458\u63a7\u5236\u53f0\u3001\u8bbe\u7f6e\u3001Visual Studio Code \u7684 Salesforce \u6269\u5c55\u4e2d\u6216\u4f7f\u7528 API \u8fd0\u884c Apex \u6d4b\u8bd5\u65b9\u6cd5\u3002<\/li>\n\n\n\n<li><strong>\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5<\/strong><\/li>\n\n\n\n<li><strong>\u6d4b\u8bd5\u5b9e\u4f8b<\/strong><\/li>\n\n\n\n<li><strong>\u6d4b\u8bd5\u548c\u4ee3\u7801\u8986\u76d6\u7387<\/strong><br>Apex \u6d4b\u8bd5\u6846\u67b6\u4e3a\u60a8\u7684 Apex \u7c7b\u751f\u6210\u4ee3\u7801\u8986\u76d6\u7387\u6570\u5b57\uff0c\u5e76\u5728\u60a8\u6bcf\u6b21\u8fd0\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u6d4b\u8bd5\u65f6\u89e6\u53d1\u3002\u4ee3\u7801\u8986\u76d6\u7387\u6307\u793a\u6d4b\u8bd5\u65b9\u6cd5\u5df2\u6267\u884c\u7c7b\u548c\u89e6\u53d1\u5668\u4e2d\u6709\u591a\u5c11\u884c\u53ef\u6267\u884c\u4ee3\u7801\u3002\u7f16\u5199\u6d4b\u8bd5\u65b9\u6cd5\u6765\u6d4b\u8bd5\u89e6\u53d1\u5668\u548c\u7c7b\uff0c\u7136\u540e\u8fd0\u884c\u8fd9\u4e9b\u6d4b\u8bd5\u4ee5\u751f\u6210\u4ee3\u7801\u8986\u76d6\u7387\u4fe1\u606f\u3002<\/li>\n\n\n\n<li>\u4ee3\u7801\u8986\u76d6\u7387\u6700\u4f73\u5b9e\u8df5 \u8bf7\u8003\u8651\u4ee5\u4e0b\u4ee3\u7801\u8986\u76d6\u7387\u63d0\u793a\u548c<strong>\u6700\u4f73\u5b9e\u8df5<\/strong><br>\u3002<\/li>\n\n\n\n<li><strong>\u4f7f\u7528 Stub API \u6784\u5efa\u6a21\u62df<\/strong>\u6846\u67b6 Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u7528\u4e8e\u5b9e\u73b0\u6a21\u62df\u6846\u67b6\u7684\u5b58\u6839 API<br>\u3002\u6a21\u62df\u6846\u67b6\u6709\u5f88\u591a\u597d\u5904\u3002\u5b83\u53ef\u4ee5\u7b80\u5316\u548c\u6539\u8fdb\u6d4b\u8bd5\uff0c\u5e76\u5e2e\u52a9\u60a8\u521b\u5efa\u66f4\u5feb\u3001\u66f4\u53ef\u9760\u7684\u6d4b\u8bd5\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5355\u72ec\u6d4b\u8bd5\u7c7b\uff0c\u8fd9\u5bf9\u4e8e\u5355\u5143\u6d4b\u8bd5\u975e\u5e38\u91cd\u8981\u3002\u4f7f\u7528\u5b58\u6839 API \u6784\u5efa\u6a21\u62df\u6846\u67b6\u4e5f\u662f\u6709\u76ca\u7684\uff0c\u56e0\u4e3a\u5b58\u6839\u5bf9\u8c61\u662f\u5728\u8fd0\u884c\u65f6\u751f\u6210\u7684\u3002\u7531\u4e8e\u8fd9\u4e9b\u5bf9\u8c61\u662f\u52a8\u6001\u751f\u6210\u7684\uff0c\u56e0\u6b64\u4e0d\u5fc5\u6253\u5305\u548c\u90e8\u7f72\u6d4b\u8bd5\u7c7b\u3002\u60a8\u53ef\u4ee5\u6784\u5efa\u81ea\u5df1\u7684\u6a21\u62df\u6846\u67b6\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u5176\u4ed6\u4eba\u6784\u5efa\u7684\u6a21\u62df\u6846\u67b6\u3002<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u4e86\u89e3 Apex \u4e2d\u7684\u6d4b\u8bd5<\/h1>\n\n\n\n<p><a><\/a>\u6d4b\u8bd5\u662f\u957f\u671f\u6210\u529f\u53d1\u5c55\u7684\u5173\u952e\uff0c\u662f\u4e00\u79cd \u5f00\u53d1\u8fc7\u7a0b\u7684\u5173\u952e\u7ec4\u6210\u90e8\u5206\u3002\u5f3a\u70c8\u5efa\u8bae\u4f7f\u7528\u6d4b\u8bd5\u9a71\u52a8\u5f00\u53d1\u8fc7\u7a0b\uff0c\u5373\u540c\u65f6\u8fdb\u884c\u7684<dfn>\u6d4b\u8bd5\u5f00\u53d1<\/dfn>&nbsp;\u65f6\u95f4\u5373\u4ee3\u7801\u5f00\u53d1\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e3a\u4ec0\u4e48\u8981\u6d4b\u8bd5 Apex\uff1f<\/h2>\n\n\n\n<p>\u6d4b\u8bd5\u662f\u5e94\u7528\u7a0b\u5e8f\u6210\u529f\u7684\u5173\u952e\uff0c\u5c24\u5176\u662f\u5f53\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u8981 \u90e8\u7f72\u5230\u5ba2\u6237\u3002\u5982\u679c\u9a8c\u8bc1\u5e94\u7528\u7a0b\u5e8f\u662f\u5426\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u5219\u6709 \u6ca1\u6709\u610f\u5916\u884c\u4e3a\uff0c\u60a8\u7684\u5ba2\u6237\u4f1a\u66f4\u52a0\u4fe1\u4efb\u60a8\u3002<\/p>\n\n\n\n<p>\u6709\u4e24\u79cd\u65b9\u6cd5\u53ef\u4ee5\u6d4b\u8bd5\u5e94\u7528\u7a0b\u5e8f\u3002\u4e00\u79cd\u662f\u901a\u8fc7Salesforce\u7528\u6237\u754c\u9762\uff0c \u5f88\u91cd\u8981\uff0c\u4f46\u4ec5\u4ec5\u901a\u8fc7\u7528\u6237\u754c\u9762\u8fdb\u884c\u6d4b\u8bd5\u5e76\u4e0d\u80fd\u6355\u83b7\u6240\u6709\u7528\u4f8b \u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u3002\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u6d4b\u8bd5\u6279\u91cf\u529f\u80fd\uff1a\u6700\u591a\u53ef\u4ee5\u6d4b\u8bd5 200 \u6761\u8bb0\u5f55 \u5982\u679c\u4ee3\u7801\u662f\u4f7f\u7528 SOAP API \u6216 Visualforce \u6807\u51c6\u96c6\u8c03\u7528\u7684\uff0c\u5219\u901a\u8fc7\u4ee3\u7801\u8fdb\u884c\u4f20\u9012 \u63a7\u5236\u5668\u3002<\/p>\n\n\n\n<p>\u5e94\u7528\u7a0b\u5e8f\u5f88\u5c11\u5b8c\u6210\u3002\u60a8\u5c06\u62e5\u6709\u5b83\u7684\u5176\u4ed6\u7248\u672c\uff0c\u60a8\u53ef\u4ee5\u5728\u5176\u4e2d\u8fdb\u884c\u66f4\u6539 \u5e76\u6269\u5c55\u529f\u80fd\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u7f16\u5199\u4e86\u5168\u9762\u7684\u6d4b\u8bd5\uff0c\u4f60\u53ef\u4ee5\u786e\u4fdd \u56de\u5f52\u4e0d\u4f1a\u968f\u4efb\u4f55\u65b0\u529f\u80fd\u4e00\u8d77\u5f15\u5165\u3002\u5728\u4e3a Salesforce \u90e8\u7f72\u4ee3\u7801\u6216\u6253\u5305\u4ee3\u7801\u4e4b\u524d AppExchange\uff0c\u5219\u5fc5\u987b\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5355\u5143\u6d4b\u8bd5\u5fc5\u987b\u81f3\u5c11\u8986\u76d6 75% \u7684 Apex \u4ee3\u7801\uff0c\u5e76\u4e14\u6240\u6709\u8fd9\u4e9b\u6d4b\u8bd5\u90fd\u5fc5\u987b \u6210\u529f\u5b8c\u6210\u3002\u8bf7\u6ce8\u610f\u4ee5\u4e0b\u4e8b\u9879\u3002\n<ul class=\"wp-block-list\">\n<li>\u5c06 Apex \u90e8\u7f72\u5230\u751f\u4ea7\u7ec4\u7ec7\u65f6\uff0c\u6bcf\u4e2a\u5355\u5143\u6d4b\u8bd5 \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5c06\u6267\u884c Organization \u547d\u540d\u7a7a\u95f4\u3002<\/li>\n\n\n\n<li><a><\/a>\u8c03\u7528\u4e0d\u8ba1\u5165 Apex \u4ee3\u7801\u7684\u4e00\u90e8\u5206 \u8986\u76d6\u3002<samp>System.debug<\/samp><\/li>\n\n\n\n<li>\u6d4b\u8bd5\u65b9\u6cd5\u548c\u6d4b\u8bd5\u7c7b\u4e0d\u8ba1\u4e3a Apex \u4ee3\u7801\u7684\u4e00\u90e8\u5206 \u8986\u76d6\u3002<\/li>\n\n\n\n<li>\u867d\u7136\u53ea\u6709 75% \u7684 Apex \u4ee3\u7801\u5fc5\u987b\u88ab\u6d4b\u8bd5\u8986\u76d6\uff0c\u4f46\u4e0d\u8981\u4e13\u6ce8\u4e8e \u6240\u8986\u76d6\u4ee3\u7801\u7684\u767e\u5206\u6bd4\u3002\u76f8\u53cd\uff0c\u8bf7\u786e\u4fdd\u6bcf\u6b21\u4f7f\u7528 \u6db5\u76d6\u60a8\u7684\u7533\u8bf7\u6848\u4f8b\uff0c\u5305\u62ec\u6b63\u9762\u548c\u8d1f\u9762\u6848\u4f8b\uff0c \u4ee5\u53ca\u6279\u91cf\u548c\u5355\u6761\u8bb0\u5f55\u3002\u8fd9\u79cd\u65b9\u6cd5\u53ef\u786e\u4fdd 75% \u6216\u66f4\u591a \u7684\u4ee3\u7801\u5305\u542b\u5728\u5355\u5143\u6d4b\u8bd5\u4e2d\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u6bcf\u4e2a\u89e6\u53d1\u5668\u90fd\u5fc5\u987b\u5177\u6709\u4e00\u5b9a\u7684\u6d4b\u8bd5\u8986\u76d6\u7387\u3002<\/li>\n\n\n\n<li>\u6240\u6709\u7c7b\u548c\u89e6\u53d1\u5668\u90fd\u5fc5\u987b\u6210\u529f\u7f16\u8bd1\u3002<\/li>\n<\/ul>\n\n\n\n<p>Salesforce \u5728\u5177\u6709 Apex \u4ee3\u7801\u7684\u6240\u6709\u7ec4\u7ec7\u4e2d\u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\uff0c\u4ee5\u9a8c\u8bc1\u6ca1\u6709\u884c\u4e3a \u5df2\u56e0\u4efb\u4f55\u670d\u52a1\u5347\u7ea7\u800c\u66f4\u6539\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u5728 Apex \u4e2d\u6d4b\u8bd5\u4ec0\u4e48<\/h1>\n\n\n\n<p>Salesforce \u5efa\u8bae\u60a8\u4e3a\u4ee5\u4e0b\u5185\u5bb9\u7f16\u5199\u6d4b\u8bd5\uff1a\u5355\u6b21\u64cd\u4f5c\u6d4b\u8bd5\u4ee5\u9a8c\u8bc1\u5355\u4e2a\u8bb0\u5f55\u662f\u5426\u751f\u6210\u6b63\u786e\u7684\u9884\u671f\u7ed3\u679c\u3002\u6279\u91cf\u64cd\u4f5c\u4efb\u4f55 Apex \u4ee3\u7801\uff0c\u65e0\u8bba\u662f\u89e6\u53d1\u5668\u3001\u7c7b\u8fd8\u662f\u6269\u5c55\uff0c\u90fd\u53ef\u4ee5\u4e3a 1 \u5230 200 \u8c03\u7528 \u8bb0\u5f55\u3002\u60a8\u4e0d\u4ec5\u5fc5\u987b\u6d4b\u8bd5\u5355\u4e2a\u8bb0\u5f55\u6848\u4f8b\uff0c\u8fd8\u5fc5\u987b\u6d4b\u8bd5\u6279\u91cf\u6848\u4f8b\u3002\u79ef\u6781\u884c\u4e3a\u6d4b\u8bd5\u4ee5\u9a8c\u8bc1\u9884\u671f\u884c\u4e3a\u662f\u5426\u901a\u8fc7\u6bcf\u4e2a\u9884\u671f\u7684\u6392\u5217\u53d1\u751f\uff0c\u5373 \u662f\uff0c\u7528\u6237\u6b63\u786e\u586b\u5199\u4e86\u6240\u6709\u5185\u5bb9\u5e76\u4e14\u6ca1\u6709\u8d85\u51fa\u9650\u5236\u3002\u8d1f\u9762\u884c\u4e3a\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u53ef\u80fd\u5b58\u5728\u9650\u5236\uff0c\u4f8b\u5982\u65e0\u6cd5\u6dfb\u52a0\u672a\u6765\u65e5\u671f\u3001 \u65e0\u6cd5\u6307\u5b9a\u8d1f\u6570\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002\u60a8\u5fc5\u987b\u6d4b\u8bd5\u9634\u6027\u60c5\u51b5 \u5e76\u9a8c\u8bc1\u9519\u8bef\u6d88\u606f\u662f\u5426\u6b63\u786e\u751f\u6210\uff0c\u4ee5\u53ca\u5bf9\u4e8e\u6b63\u9519\u8bef\u6d88\u606f\uff0c\u5728 \u9650\u5236\u60c5\u51b5\u3002\u53d7\u9650\u7528\u6237\u6d4b\u8bd5\u5bf9\u4ee3\u7801\u4e2d\u4f7f\u7528\u7684 sObject \u5177\u6709\u53d7\u9650\u8bbf\u95ee\u6743\u9650\u7684\u7528\u6237\u662f\u5426\u770b\u5230 \u9884\u671f\u884c\u4e3a\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5b83\u4eec\u662f\u5426\u53ef\u4ee5\u8fd0\u884c\u4ee3\u7801\u6216\u63a5\u6536\u9519\u8bef\u6d88\u606f\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u6761\u4ef6\u8fd0\u7b97\u7b26\u548c\u4e09\u5143\u8fd0\u7b97\u7b26\u4e0d\u88ab\u89c6\u4e3a\u6267\u884c\uff0c\u9664\u975e\u4e24\u8005\u90fd\u4e3a\u6b63 \u5e76\u6267\u884c\u8d1f\u5206\u652f\u3002<\/p>\n\n\n\n<p>\u6709\u5173\u8fd9\u4e9b\u7c7b\u578b\u7684\u6d4b\u8bd5\u7684\u793a\u4f8b\uff0c\u8bf7\u53c2\u9605\u6d4b\u8bd5 \u793a\u4f8b<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4ec0\u4e48\u662f Apex \u5355\u5143\u6d4b\u8bd5\uff1f<\/h1>\n\n\n\n<p>\u4e3a\u4e86\u4fc3\u8fdb\u5065\u58ee\u3001\u65e0\u9519\u8bef\u7684\u4ee3\u7801\u7684\u5f00\u53d1\uff0cApex \u652f\u6301\u521b\u5efa\u548c&nbsp;<dfn>\u6267\u884c\u5355\u5143\u6d4b\u8bd5<\/dfn>\u3002\u5355\u5143\u6d4b\u8bd5\u662f\u9a8c\u8bc1 \u7279\u5b9a\u4ee3\u7801\u6bb5\u5de5\u4f5c\u6b63\u5e38\u3002\u5355\u5143\u6d4b\u8bd5\u65b9\u6cd5\u4e0d\u5e26\u4efb\u4f55\u53c2\u6570\uff0c \u4e0d\u5411\u6570\u636e\u5e93\u63d0\u4ea4\u4efb\u4f55\u6570\u636e\uff0c\u4e5f\u4e0d\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u3002\u6b64\u7c7b\u65b9\u6cd5\u5728\u65b9\u6cd5\u5b9a\u4e49\u4e2d\u4f7f\u7528\u6ce8\u91ca\u8fdb\u884c\u6807\u8bb0\u3002 \u5355\u5143\u6d4b\u8bd5\u65b9\u6cd5\u5fc5\u987b\u5728\u6d4b\u8bd5\u7c7b\u4e2d\u5b9a\u4e49\uff0c\u5373\u7528 \u6279\u6ce8\u7684\u7c7b\u3002<samp>@IsTest<\/samp><samp>@IsTest<\/samp>\u4f8b\u5982\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@IsTest\nprivate class myClass {\n    @IsTest\n    static void myTest() {\n        \/\/ code_block\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u4f7f\u7528\u6ce8\u89e3\u5b9a\u4e49\u7c7b\u548c \u4ec5\u5305\u542b\u7528\u4e8e\u6d4b\u8bd5\u5e94\u7528\u7a0b\u5e8f\u7684\u4ee3\u7801\u7684\u65b9\u6cd5\u3002\u6ce8\u91ca\u53ef\u4ee5\u91c7\u7528\u591a\u4e2a\u4fee\u9970\u7b26 \u62ec\u53f7\u5185\uff0c\u5e76\u7528\u7a7a\u683c\u5206\u9694\u3002<samp>@IsTest<\/samp><samp>@IsTest<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u4e0a\u7684\u6ce8\u91ca methods \u7b49\u540c\u4e8e\u5173\u952e\u5b57\u3002\u5982 \u6700\u4f73\u505a\u6cd5\uff0cSalesforce \u5efa\u8bae\u60a8\u4f7f\u7528 \u800c\u4e0d\u662f .\u5173\u952e\u5b57\u53ef\u4ee5\u5728 \u672a\u6765\u7248\u672c\u3002<samp>@IsTest<\/samp><samp>testMethod<\/samp><samp>@IsTest<\/samp><samp>testMethod<\/samp><samp>testMethod<\/samp><\/p>\n\n\n\n<p>\u6b64\u6d4b\u8bd5\u7c7b\u793a\u4f8b\u5305\u542b\u4e24\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@IsTest\nprivate class MyTestClass {\n\n   \/\/ Methods for testing\n   @IsTest\n   static void test1() {\n      \/\/ Implement test code\n   }\n\n   @IsTest\n   static void test2() {\n      \/\/ Implement test code\n   }\n\n}<\/code><\/pre>\n\n\n\n<p>\u7c7b\u548c\u65b9\u6cd5\u5b9a\u4e49\u4e3a can be \u6216 \u3002\u6d4b\u8bd5\u7c7b\u65b9\u6cd5\u7684\u8bbf\u95ee\u7ea7\u522b \u65e0\u6240\u8c13\u3002\u5728\u5b9a\u4e49\u6d4b\u8bd5\u7c7b\u6216 \u6d4b\u8bd5\u65b9\u6cd5\u3002Apex \u4e2d\u7684\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b\u662f\u79c1\u6709\u7684\u3002\u6d4b\u8bd5\u6846\u67b6\u53ef\u4ee5 \u59cb\u7ec8\u627e\u5230\u6d4b\u8bd5\u65b9\u6cd5\u5e76\u6267\u884c\u5b83\u4eec\uff0c\u65e0\u8bba\u5176\u8bbf\u95ee\u7ea7\u522b\u5982\u4f55\u3002<samp>@IsTest<\/samp><samp>private<\/samp><samp>public<\/samp><\/p>\n\n\n\n<p>\u5b9a\u4e49\u4e3a\u5fc5\u987b\u662f\u9876\u7ea7\u7684\u7c7b \u7c7b\uff0c\u4e0d\u80fd\u662f\u63a5\u53e3\u6216\u679a\u4e3e\u3002<samp>@IsTest<\/samp><\/p>\n\n\n\n<p>\u6d4b\u8bd5\u7c7b\u7684\u65b9\u6cd5\u53ea\u80fd\u4ece\u6d4b\u8bd5\u65b9\u6cd5\u6216\u6d4b\u8bd5\u8c03\u7528\u7684\u4ee3\u7801\u4e2d\u8c03\u7528 \u65b9\u6cd5;\u975e\u6d4b\u8bd5\u8bf7\u6c42\u65e0\u6cd5\u8c03\u7528\u5b83\u3002<\/p>\n\n\n\n<p>\u6b64\u793a\u4f8b\u663e\u793a\u8981\u6d4b\u8bd5\u7684\u7c7b\u53ca\u5176\u5bf9\u5e94\u7684\u6d4b\u8bd5\u7c7b\u3002\u5b83\u5305\u542b\u4e24\u4e2a \u65b9\u6cd5\u548c\u6784\u9020\u51fd\u6570\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class TVRemoteControl {\n    \/\/ Volume to be modified\n    Integer volume;\n    \/\/ Constant for maximum volume value\n    static final Integer MAX_VOLUME = 50;    \n    \n    \/\/ Constructor\n    public TVRemoteControl(Integer v) {\n        \/\/ Set initial value for volume\n        volume = v;\n    }\n        \n    public Integer increaseVolume(Integer amount) {\n        volume += amount;\n        if (volume &gt; MAX_VOLUME) {\n            volume = MAX_VOLUME;\n        } \n        return volume;\n    }\n    \n    public Integer decreaseVolume(Integer amount) {\n        volume -= amount;\n        if (volume &lt; 0) {\n            volume = 0;\n        }  \n        return volume;\n    }    \n    \n    public static String getMenuOptions() {\n        return 'AUDIO SETTINGS - VIDEO SETTINGS';\n    }\n       \n}<\/code><\/pre>\n\n\n\n<p>\u6b64\u793a\u4f8b\u5305\u542b\u5177\u6709\u56db\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u7684\u76f8\u5e94\u6d4b\u8bd5\u7c7b\u3002\u4e2d\u7684\u6bcf\u4e2a\u65b9\u6cd5 \u8c03\u7528\u4e0a\u4e00\u4e2a\u7c7b\u3002\u5c3d\u7ba1\u6709\u8db3\u591f\u7684\u6d4b\u8bd5\u8986\u76d6\u7387\uff0c\u4f46\u6d4b\u8bd5 Test \u7c7b\u4e2d\u7684\u65b9\u6cd5\u6267\u884c\u989d\u5916\u7684\u6d4b\u8bd5\u4ee5\u9a8c\u8bc1\u8fb9\u754c\u6761\u4ef6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@IsTest\nclass TVRemoteControlTest {\n    @IsTest \n    static void testVolumeIncrease() {\n        TVRemoteControl rc = new TVRemoteControl(10);\n        Integer newVolume = rc.increaseVolume(15);\n        System.assertEquals(25, newVolume);\n    }\n    \n    @IsTest\n    static void testVolumeDecrease() {\n        TVRemoteControl rc = new TVRemoteControl(20);\n        Integer newVolume = rc.decreaseVolume(15);\n        System.assertEquals(5, newVolume);        \n    } \n        \n    @IsTest\n    static void testVolumeIncreaseOverMax() {\n        TVRemoteControl rc = new TVRemoteControl(10);\n        Integer newVolume = rc.increaseVolume(100);\n        System.assertEquals(50, newVolume);        \n    }\n    \n    @IsTest\n    static void testVolumeDecreaseUnderMin() {\n        TVRemoteControl rc = new TVRemoteControl(10);\n        Integer newVolume = rc.decreaseVolume(100);\n        System.assertEquals(0, newVolume);        \n    }\n    \n    @IsTest\n    static void testGetMenuOptions() {\n        \/\/ Static method call. No need to create a class instance.\n        String menu = TVRemoteControl.getMenuOptions();\n        System.assertNotEquals(null, menu);\n        System.assertNotEquals('', menu);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5355\u5143\u6d4b\u8bd5\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u6709\u5173\u5355\u5143\u6d4b\u8bd5\u7684\u4e00\u4e9b\u6ce8\u610f\u4e8b\u9879\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4ece Salesforce API 28.0 \u5f00\u59cb\uff0c\u6d4b\u8bd5\u65b9\u6cd5\u4e0d\u80fd\u518d\u9a7b\u7559\u5728\u975e\u6d4b\u8bd5\u4e2d \u7c7b\uff0c\u5e76\u4e14\u5fc5\u987b\u662f\u7528 \u6ce8\u91ca\u7684\u7c7b\u7684\u4e00\u90e8\u5206\u3002\u8bf7\u53c2\u9605\u00a0<samp>TestVisible<\/samp>\u00a0\u6ce8\u89e3\u4ee5\u4e86\u89e3 \u5982\u4f55\u4ece\u6d4b\u8bd5\u7c7b\u8bbf\u95ee\u79c1\u6709\u7c7b\u6210\u5458\u3002<samp>IsTest<\/samp><\/li>\n\n\n\n<li>\u6d4b\u8bd5\u65b9\u6cd5\u4e0d\u80fd\u7528\u4e8e\u6d4b\u8bd5 Web \u670d\u52a1\u6807\u6ce8\u3002\u76f8\u53cd\uff0c\u8bf7\u4f7f\u7528 \u6a21\u62df\u6807\u6ce8\u3002\u8bf7\u53c2\u9605\u6d4b\u8bd5 Web \u670d\u52a1\u6807\u6ce8\u548c\u6d4b\u8bd5 HTTP \u6807\u6ce8\u3002<\/li>\n\n\n\n<li>\u4e0d\u80fd\u4ece\u6d4b\u8bd5\u65b9\u6cd5\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u3002<\/li>\n\n\n\n<li>\u7531\u4e8e\u6d4b\u8bd5\u65b9\u6cd5\u4e0d\u4f1a\u63d0\u4ea4\u5728\u6d4b\u8bd5\u4e2d\u521b\u5efa\u7684\u6570\u636e\uff0c\u56e0\u6b64 \u4e0d\u5fc5\u5728\u5b8c\u6210\u540e\u5220\u9664\u6d4b\u8bd5\u6570\u636e\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u6d4b\u8bd5\u7c7b\u4e2d\u9759\u6001\u6210\u5458\u53d8\u91cf\u7684\u503c\u5728 testSetup \u6216 test \u65b9\u6cd5\uff0c\u5219\u4e0d\u4f1a\u4fdd\u7559\u65b0\u503c\u3002\u5176\u4ed6\u6d4b\u8bd5\u65b9\u6cd5 \u6b64\u7c7b\u83b7\u53d6\u9759\u6001\u6210\u5458\u53d8\u91cf\u7684\u539f\u59cb\u503c\u3002\u6b64\u884c\u4e3a \u5f53\u9759\u6001\u6210\u5458\u53d8\u91cf\u5728\u53e6\u4e00\u4e2a\u7c7b\u4e2d\u5b9a\u4e49\u65f6\u4e5f\u9002\u7528\uff0c\u5e76\u4e14 \u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u8bbf\u95ee\u3002<\/li>\n\n\n\n<li>\u5bf9\u4e8e\u67d0\u4e9b\u5177\u6709\u5177\u6709\u552f\u4e00\u7ea6\u675f\u7684\u5b57\u6bb5\u7684 sObject\uff0c\u63d2\u5165\u91cd\u590d\u9879 sObject \u8bb0\u5f55\u9519\u8bef\u7ed3\u679c\u3002\u4f8b\u5982\uff0c\u63d2\u5165 CollaborationGroup \u5177\u6709\u76f8\u540c\u540d\u79f0\u7684 sObject \u4f1a\u5bfc\u81f4\u9519\u8bef\uff0c\u56e0\u4e3a CollaborationGroup \u8bb0\u5f55\u5fc5\u987b\u5177\u6709\u552f\u4e00\u7684\u540d\u79f0\u3002<\/li>\n\n\n\n<li>Chatter \u6458\u8981\u4e2d\u8bb0\u5f55\uff08FeedTrackedChange \u8bb0\u5f55\uff09\u7684\u8ddf\u8e2a\u66f4\u6539\u4e0d\u662f \u5f53\u6d4b\u8bd5\u65b9\u6cd5\u4fee\u6539\u5173\u8054\u8bb0\u5f55\u65f6\u53ef\u7528\u3002FeedTracked\u66f4\u6539 \u8bb0\u5f55\u8981\u6c42\u5bf9\u4e0e\u5176\u5173\u8054\u7684\u7236\u8bb0\u5f55\u8fdb\u884c\u66f4\u6539 \u5728\u521b\u5efa\u6570\u636e\u5e93\u4e4b\u524d\u63d0\u4ea4\u5230\u6570\u636e\u5e93\u3002\u7531\u4e8e\u6d4b\u8bd5\u65b9\u6cd5\u6ca1\u6709 \u63d0\u4ea4\u6570\u636e\uff0c\u5b83\u4eec\u4e0d\u4f1a\u5bfc\u81f4\u521b\u5efa FeedTrackedChange \u8bb0\u5f55\u3002 \u540c\u6837\uff0c\u65e0\u6cd5\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u521b\u5efa\u5b57\u6bb5\u5386\u53f2\u8bb0\u5f55\u8ddf\u8e2a\u8bb0\u5f55 \u56e0\u4e3a\u5b83\u4eec\u9700\u8981\u9996\u5148\u63d0\u4ea4\u5176\u4ed6 sObject \u8bb0\u5f55\u3002\u4f8b\u5982 \u65e0\u6cd5\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u521b\u5efa AccountHistory \u8bb0\u5f55\uff0c\u56e0\u4e3a Account \u8bb0\u5f55 \u5fc5\u987b\u9996\u5148\u63d0\u4ea4\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u60a8\u7684\u6d4b\u8bd5\u5305\u62ec DML\uff0c\u8bf7\u786e\u4fdd\u4e0d\u8d85\u8fc7MAX_DML_ROWS \u9650\u5236\u3002\u8bf7\u53c2\u9605\u6267\u884c\u8c03\u63a7\u5668\u548c\u9650\u5236\u4e2d\u7684\u201c\u5176\u4ed6\u9876\u70b9\u9650\u5236\u201d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8bbf\u95ee\u79c1\u6709\u6d4b\u8bd5\u7c7b\u6210\u5458<\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\">\u8bbf\u95ee\u79c1\u6709\u6d4b\u8bd5\u7c7b\u6210\u5458<\/h1>\n\n\n\n<p>\u6d4b\u8bd5\u65b9\u6cd5\u662f\u5728\u6d4b\u8bd5\u7c7b\u4e2d\u5b9a\u4e49\u7684\uff0c\u4e0e\u5b83\u4eec\u6d4b\u8bd5\u7684\u7c7b\u5206\u5f00\u3002\u8fd9\u53ef\u4ee5 \u5f53\u5fc5\u987b\u4ece\u6d4b\u8bd5\u4e2d\u8bbf\u95ee\u79c1\u6709\u7c7b\u6210\u5458\u53d8\u91cf\u65f6\u51fa\u73b0\u95ee\u9898 \u65b9\u6cd5\uff0c\u6216\u8005\u5728\u8c03\u7528\u79c1\u6709\u65b9\u6cd5\u65f6\u3002\u56e0\u4e3a\u8fd9\u4e9b\u662f\u79c1\u6709\u7684\uff0c\u6240\u4ee5\u5b83\u4eec\u4e0d\u662f \u5bf9\u6d4b\u8bd5\u7c7b\u53ef\u89c1\u3002\u60a8\u53ef\u4ee5\u4fee\u6539\u7c7b\u4e2d\u7684\u4ee3\u7801\u4ee5\u516c\u5f00\u516c\u5171 \u5c06\u4f7f\u7528\u8fd9\u4e9b\u79c1\u6709\u7c7b\u6210\u5458\u7684\u65b9\u6cd5\uff0c\u6216\u8005\u60a8\u53ef\u4ee5\u7b80\u5355\u5730\u6ce8\u91ca \u8fd9\u4e9b\u5e26\u6709 . \u5f53\u60a8\u4f7f\u7528\u6b64\u6279\u6ce8\u5bf9\u79c1\u6709\u6210\u5458\u6216\u53d7\u4fdd\u62a4\u6210\u5458\u8fdb\u884c\u6279\u6ce8\u65f6\uff0c\u5b83\u4eec\u53ef\u4ee5 \u7531\u6d4b\u8bd5\u65b9\u6cd5\u8bbf\u95ee\uff0c\u5e76\u4e14\u4ec5\u5728\u6d4b\u8bd5\u4e0a\u4e0b\u6587\u4e2d\u8fd0\u884c\u4ee3\u7801\u3002<samp>TestVisible<\/samp><\/p>\n\n\n\n<p>\u6b64\u793a\u4f8b\u8bf4\u660e\u5982\u4f55\u4e0e \u79c1\u6709\u6210\u5458\u53d8\u91cf\uff0c\u5e26\u6709\u6784\u9020\u51fd\u6570\u7684\u79c1\u6709\u5185\u90e8\u7c7b\uff0c\u79c1\u6709\u65b9\u6cd5\uff0c \u548c\u79c1\u6709\u81ea\u5b9a\u4e49\u4f8b\u5916\u3002\u6240\u6709\u8fd9\u4e9b\u90fd\u53ef\u4ee5\u5728\u6d4b\u8bd5\u7c7b\u4e2d\u8bbf\u95ee\uff0c\u56e0\u4e3a \u5b83\u4eec\u5e26\u6709 \u6ce8\u91ca\u3002\u8fd9 \u7c7b\u9996\u5148\u5217\u51fa\uff0c\u540e\u8ddf\u4e00\u4e2a\u5305\u542b\u6d4b\u8bd5\u65b9\u6cd5\u7684\u6d4b\u8bd5\u7c7b\u3002<samp>TestVisible<\/samp><samp>TestVisible<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class VisibleSampleClass {\n    \/\/ Private member variables\n    @TestVisible private Integer recordNumber = 0;\n    @TestVisible private String areaCode = '(415)';\n    \/\/ Public member variable\n    public Integer maxRecords = 1000;\n    \n    \/\/ Private inner class\n    @TestVisible class Employee {\n        String fullName;\n        String phone;\n        \n        \/\/ Constructor\n        @TestVisible Employee(String s, String ph) {\n            fullName = s;\n            phone = ph;\n        }\n    }\n       \n    \/\/ Private method\n    @TestVisible private String privateMethod(Employee e) {\n        System.debug('I am private.');\n        recordNumber++;\n        String phone = areaCode + ' ' + e.phone;\n        String s = e.fullName + '\\'s phone number is ' + phone;\n        System.debug(s);\n        return s;\n    }\n    \n    \/\/ Public method\n    public void publicMethod() {\n        maxRecords++;\n        System.debug('I am public.');    \n    }\n    \n    \/\/ Private custom exception class\n    @TestVisible private class MyException extends Exception {}\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Test class for VisibleSampleClass\n@isTest\nprivate class VisibleSampleClassTest {\n\n    \/\/ This test method can access private members of another class \n    \/\/ that are annotated with @TestVisible.\n    static testmethod void test1() {\n        VisibleSampleClass sample = new VisibleSampleClass ();\n\n        \/\/ Access private data members and update their values\n        sample.recordNumber = 100;\n        sample.areaCode = '(510)';\n        \n        \/\/ Access private inner class\n        VisibleSampleClass.Employee emp = \n            new VisibleSampleClass.Employee('Joe Smith', '555-1212');\n        \n        \/\/ Call private method\n        String s = sample.privateMethod(emp);\n        \n        \/\/ Verify result\n        System.assert(\n            s.contains('(510)') &amp;&amp;\n            s.contains('Joe Smith') &amp;&amp;\n            s.contains('555-1212'));\n    }\n    \n    \/\/ This test method can throw private exception defined in another class\n    static testmethod void test2() {\n        \/\/ Throw private exception.\n        try {\n            throw new VisibleSampleClass.MyException('Thrown from a test.');\n        } catch(VisibleSampleClass.MyException e) {\n            \/\/ Handle exception \n        }\n    }\n    \n    static testmethod void test3() {\n        \/\/ Access public method.\n        \/\/ No @TestVisible is used.\n        VisibleSampleClass sample = new VisibleSampleClass ();\n        sample.publicMethod();\n    }   \n\n}<\/code><\/pre>\n\n\n\n<p>\u5f53\u60a8 \u5347\u7ea7 Salesforce API \u5305\u542b\u6df7\u5408\u6d4b\u8bd5\u4ee3\u7801\u548c\u975e\u6d4b\u8bd5\u4ee3\u7801\u7684\u73b0\u6709\u7c7b\u7684\u7248\u672c\u3002\u56e0\u4e3a\u6d4b\u8bd5 \u4ece API \u7248\u672c 28.0 \u5f00\u59cb\uff0c\u975e\u6d4b\u8bd5\u7c7b\u4e2d\u4e0d\u5141\u8bb8\u4f7f\u7528\u65b9\u6cd5\uff0c\u60a8\u5fc5\u987b \u5347\u7ea7 API \u7248\u672c \u65f6\uff0c\u5c06\u6d4b\u8bd5\u65b9\u6cd5\u4ece\u65e7\u7c7b\u79fb\u52a8\u5230\u65b0\u7684\u6d4b\u8bd5\u7c7b\uff08\u7528 \u6279\u6ce8\u7684\u7c7b\uff09 \u4f60\u7684\u73ed\u7ea7\u3002\u5728\u8bbf\u95ee\u79c1\u6709\u65b9\u6cd5\u6216 \u539f\u59cb\u7c7b\u7684\u6210\u5458\u53d8\u91cf\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u53ea\u9700\u6ce8\u91ca\u8fd9\u4e9b\u79c1\u6709 \u5177\u6709 .<samp>TestVisible<\/samp><samp>isTest<\/samp><samp>TestVisible<\/samp><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4e86\u89e3\u6d4b\u8bd5\u6570\u636e<\/h1>\n\n\n\n<p>Apex \u6d4b\u8bd5\u6570\u636e\u662f\u6682\u65f6\u6027\u7684\uff0c\u4e0d\u4f1a\u63d0\u4ea4\u5230\u6570\u636e\u5e93\u3002<\/p>\n\n\n\n<p>\u8fd9\u610f\u5473\u7740\u5728\u6d4b\u8bd5\u65b9\u6cd5\u5b8c\u6210\u6267\u884c\u540e\uff0c\u6d4b\u8bd5\u63d2\u5165\u7684\u6570\u636e \u4e0d\u4f1a\u4fdd\u7559\u5728\u6570\u636e\u5e93\u4e2d\u3002\u56e0\u6b64\uff0c\u65e0\u9700\u5220\u9664\u4efb\u4f55\u6d4b\u8bd5\u6570\u636e \u6d4b\u8bd5\u7684\u7ed3\u8bba\u3002\u540c\u6837\uff0c\u5bf9\u73b0\u6709\u8bb0\u5f55\u7684\u6240\u6709\u66f4\u6539\uff0c\u4f8b\u5982\u66f4\u65b0\u6216 \u5220\u9664\uff0c\u4e0d\u8981\u6301\u4e45\u3002\u6d4b\u8bd5\u6570\u636e\u7684\u8fd9\u79cd\u77ac\u6001\u884c\u4e3a\u4f7f\u5f97\u7ba1\u7406 \u6570\u636e\u66f4\u5bb9\u6613\uff0c\u56e0\u4e3a\u60a8\u4e0d\u5fc5\u6267\u884c\u4efb\u4f55\u6d4b\u8bd5\u6570\u636e\u6e05\u7406\u3002\u540c\u65f6\uff0c\u5982\u679c\u4f60 \u6d4b\u8bd5\u8bbf\u95ee\u7ec4\u7ec7\u6570\u636e\uff0c\u8fd9\u53ef\u4ee5\u9632\u6b62\u610f\u5916\u5220\u9664\u6216\u4fee\u6539\u73b0\u6709\u6570\u636e \u8bb0\u5f55\u3002<\/p>\n\n\n\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u73b0\u6709\u7ec4\u7ec7\u6570\u636e\u5bf9\u6d4b\u8bd5\u65b9\u6cd5\u4e0d\u53ef\u89c1\uff0c\u4f46\u4f8b\u5916 \u67d0\u4e9b\u8bbe\u7f6e\u5bf9\u8c61\u3002\u5e94\u5c3d\u53ef\u80fd\u4e3a\u6d4b\u8bd5\u65b9\u6cd5\u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u3002 \u4f46\u662f\uff0c\u9488\u5bf9 Salesforce API \u7248\u672c 23.0 \u6216\u66f4\u65e9\u7248\u672c\u4fdd\u5b58\u7684\u6d4b\u8bd5\u4ee3\u7801\u53ef\u4ee5\u8bbf\u95ee\u7ec4\u7ec7\u4e2d\u7684\u6240\u6709\u6570\u636e\u3002\u6570\u636e\u53ef\u89c1\u6027 \u4e0b\u4e00\u8282\u5c06\u66f4\u8be6\u7ec6\u5730\u4ecb\u7ecd\u6d4b\u8bd5\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5728\u5355\u5143\u6d4b\u8bd5\u4e2d\u5c06\u6d4b\u8bd5\u6570\u636e\u4e0e\u7ec4\u7ec7\u6570\u636e\u9694\u79bb<\/strong><\/li>\n\n\n\n<li><strong>\u4f7f\u7528 isTest\uff08SeeAllData=True\uff09 \u6279\u6ce8 \u6279\u6ce8<\/strong><br>\u6d4b\u8bd5\u7c7b\u6216\u6d4b\u8bd5\u65b9\u6cd5\uff0c\u4ee5\u6253\u5f00\u5bf9\u7ec4\u7ec7\u4e2d\u8bb0\u5f55\u7684\u6570\u636e\u8bbf\u95ee\u3002IsTest\uff08SeeAllData=true\uff09 \u6279\u6ce8\u9002\u7528\u4e8e\u6570\u636e\u67e5\u8be2\uff0c\u4f46\u4e0d\u9002\u7528\u4e8e\u8bb0\u5f55\u521b\u5efa\u6216\u66f4\u6539\uff0c\u5305\u62ec\u5220\u9664\u3002\u5373\u4f7f\u5728\u4f7f\u7528\u6ce8\u91ca\u65f6\uff0c\u65b0\u8bb0\u5f55\u548c\u66f4\u6539\u7684\u8bb0\u5f55\u4ecd\u4f1a\u5728 Apex \u6d4b\u8bd5\u4e2d\u56de\u6eda\u3002<samp>IsTest(SeeAllData=true)<\/samp><\/li>\n\n\n\n<li><strong>\u52a0\u8f7d<\/strong>\u6d4b\u8bd5\u6570\u636e \u4f7f\u7528\u8be5\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u586b\u5145\u6570\u636e<br>\uff0c\u800c\u65e0\u9700\u7f16\u5199\u8bb8\u591a\u4ee3\u7801\u884c\u3002<samp>Test.loadData<\/samp><\/li>\n\n\n\n<li>\u7528\u4e8e\u521b\u5efa<br>\u6d4b\u8bd5\u6570\u636e\u7684\u516c\u5171\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u7c7b \u516c\u5171\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u7c7b\u662f\u516c\u5171\u6d4b\u8bd5\u7c7b\uff0c\u5176\u4e2d\u5305\u542b<strong>\u7528\u4e8e\u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u7684<\/strong>\u53ef\u91cd\u7528\u4ee3\u7801\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5 \u4f7f\u7528\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\uff08\u7528 \u6279\u6ce8\u7684\u65b9\u6cd5\uff09\u521b\u5efa\u4e00\u6b21\u6d4b\u8bd5\u8bb0\u5f55\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u7c7b\u4e2d\u7684\u6bcf\u4e2a<strong>\u6d4b\u8bd5\u65b9\u6cd5<\/strong><br>\u4e2d\u8bbf\u95ee\u5b83\u4eec\u3002\u5f53\u60a8\u9700\u8981\u4e3a\u6240\u6709\u6d4b\u8bd5\u65b9\u6cd5\u521b\u5efa\u53c2\u8003\u6216\u5148\u51b3\u6761\u4ef6\u6570\u636e\uff0c\u6216\u8005\u9700\u8981\u4e3a\u6240\u6709\u6d4b\u8bd5\u65b9\u6cd5\u64cd\u4f5c\u7684\u4e00\u7ec4\u901a\u7528\u8bb0\u5f55\u521b\u5efa\u65f6\uff0c\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u53ef\u4ee5\u8282\u7701\u65f6\u95f4\u3002<samp>@testSetup<\/samp><\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u5c06\u6d4b\u8bd5\u6570\u636e\u4e0e\u5355\u5143\u4e2d\u7684\u7ec4\u7ec7\u6570\u636e\u9694\u79bb \u6d4b\u8bd5<\/h1>\n\n\n\n<p><a><\/a>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cApex \u6d4b\u8bd5\u65b9\u6cd5\uff08API \u7248\u672c 24.0 \u53ca\u66f4\u9ad8\u7248\u672c\uff09\u4e0d\u80fd \u8bbf\u95ee\u9884\u5148\u5b58\u5728\u7684\u7ec4\u7ec7\u6570\u636e\uff0c\u4f8b\u5982\u6807\u51c6\u5bf9\u8c61\u3001\u81ea\u5b9a\u4e49\u5bf9\u8c61\u548c\u81ea\u5b9a\u4e49\u8bbe\u7f6e \u6570\u636e\u3002\u4ed6\u4eec\u53ea\u80fd\u8bbf\u95ee\u4ed6\u4eec\u521b\u5efa\u7684\u6570\u636e\u3002\u4f46\u662f\uff0c\u7528\u4e8e\u7ba1\u7406 \u4ecd\u7136\u53ef\u4ee5\u5728\u6d4b\u8bd5\u4e2d\u8bbf\u95ee\u60a8\u7684\u7ec4\u7ec7\u6216\u5143\u6570\u636e\u5bf9\u8c61\u3002\u8fd9\u4e9b\u662f\u4e00\u4e9b \u6b64\u7c7b\u5bf9\u8c61\u7684\u793a\u4f8b\u3002<a><\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\" id=\"TestDataAccessDef2\">\n<li>\u7528\u6237<\/li>\n\n\n\n<li>\u8f6e\u5ed3<\/li>\n\n\n\n<li>\u7ec4\u7ec7<\/li>\n\n\n\n<li>Cron\u89e6\u53d1\u5668<\/li>\n\n\n\n<li>\u8bb0\u5f55\u7c7b\u578b<\/li>\n\n\n\n<li>\u9876\u70b9\u7c7b<\/li>\n\n\n\n<li>Apex\u89e6\u53d1\u5668<\/li>\n\n\n\n<li>Apex\u7ec4\u4ef6<\/li>\n\n\n\n<li>ApexPage\uff08\u9876\u70b9\u9875\u9762\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u5c3d\u53ef\u80fd\u4e3a\u6bcf\u4e2a\u6d4b\u8bd5\u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u7981\u7528\u6b64\u9650\u5236 \u4f7f\u7528\u6ce8\u91ca\u6ce8\u91ca\u6d4b\u8bd5\u7c7b\u6216\u6d4b\u8bd5\u65b9\u6cd5\u3002<samp>IsTest(SeeAllData=true)<\/samp><\/p>\n\n\n\n<p><a><\/a>\u4f7f\u7528 Salesforce API \u7248\u672c 23.0 \u6216\u66f4\u65e9\u7248\u672c\u4fdd\u5b58\u7684\u6d4b\u8bd5\u4ee3\u7801 \u7ee7\u7eed\u6709\u6743\u8bbf\u95ee\u7ec4\u7ec7\u4e2d\u7684\u6240\u6709\u6570\u636e\uff0c\u5176\u6570\u636e\u8bbf\u95ee\u6743\u9650\u4e3a \u53d8\u3002<a><\/a><a><\/a>\u6570\u636e\u8bbf\u95ee\u6ce8\u610f\u4e8b\u9879<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528\u6570\u636e\u5b64\u5c9b Apex \u6d4b\u8bd5\u65f6\uff0c\u4e0d\u652f\u6301\u4f7f\u7528\u8be5\u5173\u7cfb\u7684\u8de8\u5bf9\u8c61\u5b57\u6bb5\u5f15\u7528\u3002\u7531\u4e8e \u6b64\u9650\u5236\u5728\u6570\u636e\u5b64\u5c9b Apex \u6d4b\u8bd5\u4e2d\u8fd0\u884c\u65f6\u8fd4\u56de null\u3002<samp>Owner<\/samp><samp>SELECT Owner.IsActive FROM Account<\/samp><\/li>\n\n\n\n<li>\u5982\u679c\u4f7f\u7528 Salesforce API \u7248\u672c 24.0 \u6216\u66f4\u9ad8\u7248\u672c\u4fdd\u5b58\u7684\u65b0\u6d4b\u8bd5\u65b9\u6cd5\u8c03\u7528\u65b9\u6cd5 \u5728\u4f7f\u7528\u7248\u672c 23.0 \u6216\u66f4\u4f4e\u7248\u672c\u4fdd\u5b58\u7684\u53e6\u4e00\u4e2a\u7c7b\u4e2d\uff0c\u6570\u636e\u8bbf\u95ee\u9650\u5236 \u8c03\u7528\u65b9\u5728\u88ab\u8c03\u7528\u7684\u65b9\u6cd5\u4e2d\u5f3a\u5236\u6267\u884c\u3002\u8c03\u7528\u7684\u65b9\u6cd5\u65e0\u6cd5\u8bbf\u95ee \u7ec4\u7ec7\u6570\u636e\uff0c\u56e0\u4e3a\u8c03\u7528\u65b9\u65e0\u6cd5\u8bbf\u95ee\u5b83\uff0c\u5373\u4f7f\u5b83\u4fdd\u5b58\u5728 \u65e9\u671f\u7248\u672c\u3002<\/li>\n\n\n\n<li>\u6ce8\u89e3\u5177\u6709 \u6dfb\u52a0\u5230\u4f7f\u7528 Salesforce API \u7248\u672c 23.0 \u4fdd\u5b58\u7684 Apex \u4ee3\u7801\u65f6\u4e0d\u8d77\u4f5c\u7528\uff0c\u5e76\u4e14 \u65e9\u4e9b\u65f6\u5019\u3002<samp>IsTest(SeeAllData=true)<\/samp><\/li>\n\n\n\n<li><a><\/a>\u6b64\u5bf9\u6d4b\u8bd5\u6570\u636e\u7684\u8bbf\u95ee\u9650\u5236\u9002\u7528\u4e8e\u6240\u6709\u4ee3\u7801 \u5728\u6d4b\u8bd5\u4e0a\u4e0b\u6587\u4e2d\u8fd0\u884c\u3002\u4f8b\u5982\uff0c\u5982\u679c\u6d4b\u8bd5\u65b9\u6cd5\u5bfc\u81f4\u89e6\u53d1\u5668\u6267\u884c \u5e76\u4e14\u6d4b\u8bd5\u65e0\u6cd5\u8bbf\u95ee\u7ec4\u7ec7\u6570\u636e\uff0c\u89e6\u53d1\u5668\u5c06\u65e0\u6cd5 \u4e5f\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u6d4b\u8bd5\u53d1\u51fa Visualforce \u8bf7\u6c42\uff0c\u5219\u6267\u884c\u7684\u6d4b\u8bd5\u5c06\u505c\u7559\u5728\u6d4b\u8bd5\u4e0a\u4e0b\u6587\u4e2d\uff0c\u4f46 \u5728\u4e0d\u540c\u7684\u7ebf\u7a0b\u4e2d\u8fd0\u884c\u3002\u56e0\u6b64\uff0c\u4e0d\u518d\u5f3a\u5236\u6267\u884c\u6d4b\u8bd5\u6570\u636e\u9694\u79bb\u3002\u5728 \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6d4b\u8bd5\u5c06\u80fd\u591f\u8bbf\u95ee\u7ec4\u7ec7\u4e2d\u7684\u6240\u6709\u6570\u636e \u53d1\u8d77 Visualforce \u8bf7\u6c42\u3002\u4f46\u662f\uff0c\u5982\u679c Visualforce \u8bf7\u6c42\u6267\u884c callback\uff0c\u4f8b\u5982 JavaScript remoting \u8c03\u7528\uff0c\u5219\u56de\u8c03\u63d2\u5165\u7684\u4efb\u4f55\u6570\u636e\u90fd\u4e0d\u662f \u5bf9\u6d4b\u8bd5\u53ef\u89c1\u3002<\/li>\n\n\n\n<li>\u5728 API \u7248\u672c 27.0 \u53ca\u66f4\u65e9\u7248\u672c\u4e2d\uff0cVLOOKUP \u9a8c\u8bc1\u89c4\u5219\u51fd\u6570\u59cb\u7ec8\u67e5\u627e \u5f53\u7531\u6b63\u5728\u8fd0\u884c\u7684 Apex \u6d4b\u8bd5\u89e6\u53d1\u65f6\uff0c\u9664\u4e86\u6d4b\u8bd5\u6570\u636e\u5916\uff0c\u8fd8\u4f1a\u5411\u4e0a\u7ec4\u7ec7\u6570\u636e\u3002\u5f00\u5934\u4e3a \u7248\u672c 28.0\uff0cVLOOKUP \u9a8c\u8bc1\u89c4\u5219\u51fd\u6570\u4e0d\u518d\u8bbf\u95ee\u7ec4\u7ec7 \u6765\u81ea\u6b63\u5728\u8fd0\u884c\u7684 Apex \u6d4b\u8bd5\u7684\u6570\u636e\u3002\u8be5\u51fd\u6570\u4ec5\u67e5\u627e\u6d4b\u8bd5\u521b\u5efa\u7684\u6570\u636e\uff0c \u9664\u975e\u6d4b\u8bd5\u7c7b\u6216\u65b9\u6cd5\u7528 \u6ce8\u91ca\u3002<samp>IsTest(SeeAllData=true)<\/samp><\/li>\n\n\n\n<li>\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u60a8\u53ef\u80fd\u65e0\u6cd5\u4ece\u6d4b\u8bd5\u4e2d\u521b\u5efa\u67d0\u4e9b\u7c7b\u578b\u7684\u6570\u636e \u7531\u4e8e\u7279\u5b9a\u7684\u9650\u5236\uff0c\u65b9\u6cd5\u3002\u4ee5\u4e0b\u662f\u6b64\u7c7b\u9650\u5236\u7684\u4e00\u4e9b\u793a\u4f8b\u3002\n<ul class=\"wp-block-list\">\n<li>\u67d0\u4e9b\u6807\u51c6\u5bf9\u8c61\u4e0d\u53ef\u521b\u5efa\u3002\u6709\u5173\u8fd9\u4e9b\u5bf9\u8c61\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c \u8bf7\u53c2\u9605\u5bf9\u8c61\u53c2\u8003 Salesforce\u7684\u3002<\/li>\n\n\n\n<li>\u5bf9\u4e8e\u67d0\u4e9b\u5177\u6709\u5177\u6709\u552f\u4e00\u7ea6\u675f\u7684\u5b57\u6bb5\u7684 sObject\uff0c\u63d2\u5165\u91cd\u590d\u9879 sObject \u8bb0\u5f55\u9519\u8bef\u7ed3\u679c\u3002\u4f8b\u5982\uff0c\u63d2\u5165 CollaborationGroup \u5177\u6709\u76f8\u540c\u540d\u79f0\u7684 sObject \u4f1a\u5bfc\u81f4\u9519\u8bef\uff0c\u56e0\u4e3a CollaborationGroup \u8bb0\u5f55\u5fc5\u987b\u5177\u6709\u552f\u4e00\u7684\u540d\u79f0\u3002\u65e0\u8bba\u60a8\u7684\u6d4b\u8bd5\u662f\u5426\u88ab\u6279\u6ce8\uff0c\u90fd\u4f1a\u53d1\u751f\u6b64\u9519\u8bef \u6709 \uff0c\u6216\u6ca1\u6709\u3002<samp>IsTest(SeeAllData=true)<\/samp><\/li>\n\n\n\n<li>\u4ec5\u5728\u5c06\u76f8\u5173\u8bb0\u5f55\u63d0\u4ea4\u5230 \u6570\u636e\u5e93\uff0c\u4f8b\u5982 Chatter \u4e2d\u8ddf\u8e2a\u7684\u66f4\u6539\u3002\u8bb0\u5f55\u7684\u8ddf\u8e2a\u66f4\u6539 \uff08FeedTrackedChange \u8bb0\u5f55\uff09\u5728\u6d4b\u8bd5\u65b9\u6cd5\u65f6\u4e0d\u53ef\u7528 \u4fee\u6539\u5173\u8054\u7684\u8bb0\u5f55\u3002FeedTrackedChange \u8bb0\u5f55\u9700\u8981\u66f4\u6539\u4e3a \u4e4b\u524d\u8981\u63d0\u4ea4\u5230\u6570\u636e\u5e93\u7684\u4e0e\u5b83\u4eec\u5173\u8054\u7684\u7236\u8bb0\u5f55 \u5b83\u4eec\u88ab\u521b\u9020\u51fa\u6765\u3002\u7531\u4e8e\u6d4b\u8bd5\u65b9\u6cd5\u4e0d\u63d0\u4ea4\u6570\u636e\uff0c\u56e0\u6b64\u5b83\u4eec\u4e0d\u4f1a\u5bfc\u81f4 \u521b\u5efa FeedTrackedChange \u8bb0\u5f55\u3002\u540c\u6837\uff0c\u5b57\u6bb5\u5386\u53f2\u8bb0\u5f55\u8ddf\u8e2a\u8bb0\u5f55 \u65e0\u6cd5\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u521b\u5efa\uff0c\u56e0\u4e3a\u5b83\u4eec\u9700\u8981\u5176\u4ed6 sObject \u8bb0\u5f55 \u9996\u5148\u627f\u8bfa\u3002\u4f8b\u5982\uff0c\u65e0\u6cd5\u5728\u6d4b\u8bd5\u4e2d\u521b\u5efa AccountHistory \u8bb0\u5f55 \u65b9\u6cd5\uff0c\u56e0\u4e3a\u5fc5\u987b\u9996\u5148\u63d0\u4ea4\u5e10\u6237\u8bb0\u5f55\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528 isTest\uff08SeeAllData=True\uff09 \u6ce8\u89e3<\/h1>\n\n\n\n<p>\u5bf9\u6d4b\u8bd5\u7c7b\u6216\u6d4b\u8bd5\u65b9\u6cd5\u8fdb\u884c\u6279\u6ce8\uff0c\u4ee5\u6253\u5f00\u5bf9\u7ec4\u7ec7\u4e2d\u8bb0\u5f55\u7684\u6570\u636e\u8bbf\u95ee\u3002\u8fd9 IsTest\uff08SeeAllData=true\uff09 \u6279\u6ce8\u9002\u7528\u4e8e\u6570\u636e\u67e5\u8be2\uff0c\u4f46\u4e0d\u9002\u7528\u4e8e\u8bb0\u5f55\u521b\u5efa \u6216\u66f4\u6539\uff0c\u5305\u62ec\u5220\u9664\u3002\u65b0\u8bb0\u5f55\u548c\u66f4\u6539\u7684\u8bb0\u5f55\u4ecd\u4f1a\u5728 Apex \u6d4b\u8bd5\u4e2d\u56de\u6eda \u5373\u4f7f\u5728\u4f7f\u7528\u6ce8\u91ca\u65f6\u3002<\/p>\n\n\n\n<p><samp>IsTest(SeeAllData=true)<\/samp><\/p>\n\n\n\n<p>\u8b66\u544a<\/p>\n\n\n\n<p>\u901a\u8fc7\u7528 \u6ce8\u91ca\u7c7b\uff0c\u53ef\u4ee5\u5141\u8bb8\u6d4b\u8bd5\u65b9\u6cd5\u8bbf\u95ee\u6240\u6709\u7ec4\u7ec7\u8bb0\u5f55\u3002\u8fd9 \u4f46\u662f\uff0c\u6700\u4f73\u505a\u6cd5\u662f\u4f7f\u7528 .\u53d6\u51b3\u4e8e API \u7248\u672c \u60a8\u6b63\u5728\u4f7f\u7528\u65f6\uff0c\u9ed8\u8ba4\u6ce8\u91ca\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002<samp>@isTest(SeeAllData=true)<\/samp><samp>@isTest(SeeAllData=false)<\/samp>\u6b64\u793a\u4f8b\u6f14\u793a\u5982\u4f55\u4f7f\u7528\u6ce8\u91ca\u5b9a\u4e49\u6d4b\u8bd5\u7c7b\u3002\u6240\u6709 \u6b64\u7c7b\u4e2d\u7684\u6d4b\u8bd5\u65b9\u6cd5\u53ef\u4ee5\u8bbf\u95ee \u7ec4\u7ec7\u3002<\/p>\n\n\n\n<p><samp>@IsTest(SeeAllData=true)<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ All test methods in this class can access all data.\n@IsTest(SeeAllData=true)\npublic class TestDataAccessClass {\n\n    \/\/ This test accesses an existing account. \n    \/\/ It also creates and accesses a new test account.\n    @IsTest\n    static void myTestMethod1() {\n        \/\/ Query an existing account in the organization. \n        Account a = &#91;SELECT Id, Name FROM Account WHERE Name='Acme' LIMIT 1];\n        System.assert(a != null);\n        \n        \/\/ Create a test account based on the queried account.\n        Account testAccount = a.clone();\n        testAccount.Name = 'Acme Test';\n        insert testAccount;\n        \n        \/\/ Query the test account that was inserted.\n        Account testAccount2 = &#91;SELECT Id, Name FROM Account \n                                WHERE Name='Acme Test' LIMIT 1];\n        System.assert(testAccount2 != null);\n    }\n       \n    \n    \/\/ Like the previous method, this test method can also access all data\n    \/\/ because the containing class is annotated with @IsTest(SeeAllData=true).\n    @IsTest\n    static void myTestMethod2() {\n        \/\/ Can access all data in the organization.\n   }\n  \n}<\/code><\/pre>\n\n\n\n<p>\u7b2c\u4e8c\u4e2a\u793a\u4f8b\u6f14\u793a\u5982\u4f55\u5728\u6d4b\u8bd5\u4e0a\u5e94\u7528\u6ce8\u91ca \u65b9\u6cd5\u3002\u7531\u4e8e\u6d4b\u8bd5\u65b9\u6cd5\u7684\u7c7b\u6ca1\u6709\u6ce8\u91ca\uff0c\u56e0\u6b64\u5fc5\u987b\u6ce8\u91ca \u65b9\u6cd5\uff0c\u4ee5\u4fbf\u80fd\u591f\u8bbf\u95ee\u8be5\u65b9\u6cd5\u7684\u6240\u6709\u6570\u636e\u3002\u7b2c\u4e8c\u79cd\u6d4b\u8bd5\u65b9\u6cd5\u6ca1\u6709 \u5177\u6709\u6b64\u6ce8\u91ca\uff0c\u56e0\u6b64\u5b83\u53ea\u80fd\u8bbf\u95ee\u5b83\u521b\u5efa\u7684\u6570\u636e\u3002\u6b64\u5916\uff0c\u5b83\u8fd8\u53ef\u4ee5 \u8bbf\u95ee\u7528\u4e8e\u7ba1\u7406\u7ec4\u7ec7\u7684\u5bf9\u8c61\uff0c\u4f8b\u5982 \u7528\u6237\u3002<\/p>\n\n\n\n<p><samp>@IsTest(SeeAllData=true)<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ This class contains test methods with different data access levels.\n@IsTest\nprivate class ClassWithDifferentDataAccess {\n\n    \/\/ Test method that has access to all data.\n    @IsTest(SeeAllData=true)\n    static void testWithAllDataAccess() {\n        \/\/ Can query all data in the organization.      \n    }\n    \n    \/\/ Test method that has access to only the data it creates\n    \/\/ and organization setup and metadata objects.\n    @IsTest\n    static void testWithOwnDataAccess() {\n        \/\/ This method can still access the User object.\n        \/\/ This query returns the first user object.\n        User u = &#91;SELECT UserName,Email FROM User LIMIT 1]; \n        System.debug('UserName: ' + u.UserName);\n        System.debug('Email: ' + u.Email);\n        \n        \/\/ Can access the test account that is created here.\n        Account a = new Account(Name='Test Account');\n        insert a;      \n        \/\/ Access the account that was just created.\n        Account insertedAcct = &#91;SELECT Id,Name FROM Account \n                                WHERE Name='Test Account'];\n        System.assert(insertedAcct != null);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6ce8\u91ca\u7684\u6ce8\u610f\u4e8b\u9879<samp>@IsTest(SeeAllData=true)<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c\u6d4b\u8bd5\u7c7b\u662f\u7528\u6ce8\u89e3\u5b9a\u4e49\u7684\uff0c\u5219 \u672a\u663e\u5f0f\u8bbe\u7f6e\u5173\u952e\u5b57\u7684\u6d4b\u8bd5\u65b9\u6cd5\u3002<samp>@IsTest(SeeAllData=true)<\/samp><samp>SeeAllData=true<\/samp><samp>SeeAllData<\/samp><\/li>\n\n\n\n<li>\u6ce8\u89e3\u7528\u4e8e\u6253\u5f00 \u5728\u7c7b\u6216\u65b9\u6cd5\u7ea7\u522b\u5e94\u7528\u65f6\u7684\u6570\u636e\u8bbf\u95ee\u3002\u4f46\u662f\uff0c\u5982\u679c \u5305\u542b\u7c7b\u5df2\u7528 \u3001 \u5bf9\u4e8e\u65b9\u6cd5\uff0c\u5c06\u5ffd\u7565\u5bf9\u65b9\u6cd5\u8fdb\u884c\u6279\u6ce8\u3002 \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u8be5\u65b9\u6cd5\u4ecd\u7136\u53ef\u4ee5\u8bbf\u95ee \u7ec4\u7ec7\u3002\u4f7f\u7528\u91cd\u5199\u5bf9\u65b9\u6cd5\u8fdb\u884c\u6ce8\u91ca\uff0c\u5bf9\u4e8e\u8be5\u65b9\u6cd5\uff0c\u5bf9 \u7c7b\u3002<samp>@IsTest(SeeAllData=true)<\/samp><samp>@IsTest(SeeAllData=true)<\/samp><samp>@IsTest(SeeAllData=false)<\/samp><samp>@IsTest(SeeAllData=true)<\/samp><samp>@IsTest(SeeAllData=false)<\/samp><\/li>\n\n\n\n<li><samp>@IsTest(SeeAllData=true)<\/samp>\u5e76\u4e14\u4e0d\u80fd\u4f7f\u7528\u6ce8\u91ca \u4e00\u8d77\u4f7f\u7528\u76f8\u540c\u7684 Apex \u65b9\u6cd5\u3002<samp>@IsTest(IsParallel=true)<\/samp><\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u52a0\u8f7d\u6d4b\u8bd5\u6570\u636e<\/h1>\n\n\n\n<p>\u4f7f\u7528\u8be5\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u586b\u5145\u6570\u636e\uff0c\u800c\u65e0\u9700 \u7f16\u5199\u591a\u884c\u4ee3\u7801\u3002<\/p>\n\n\n\n<p><samp>Test.loadData<\/samp>\u8bf7\u6309\u7167\u4e0b\u5217\u6b65\u9aa4\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728 .csv \u6587\u4ef6\u4e2d\u6dfb\u52a0\u6570\u636e\u3002<\/li>\n\n\n\n<li>\u4e3a\u6b64\u6587\u4ef6\u521b\u5efa\u9759\u6001\u8d44\u6e90\u3002<\/li>\n\n\n\n<li>\u5728\u6d4b\u8bd5\u4e2d\u8c03\u7528 \u65b9\u6cd5\uff0c\u5e76\u5411\u5176\u4f20\u9012 sObject \u7c7b\u578b\u4ee4\u724c\u548c\u9759\u6001\u8d44\u6e90\u540d\u79f0\u3002<samp>Test.loadData<\/samp><\/li>\n<\/ol>\n\n\n\n<p>\u4f8b\u5982\uff0c\u5bf9\u4e8e\u5e10\u6237\u8bb0\u5f55\u548c\u9759\u6001\u8d44\u6e90\u540d\u79f0 \uff0c\u8fdb\u884c\u4ee5\u4e0b\u8c03\u7528\uff1a<\/p>\n\n\n\n<p><kbd>myResource<\/kbd><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;sObject&gt; ls = Test.loadData(Account.sObjectType, 'myResource');<\/code><\/pre>\n\n\n\n<p>\u65b9\u6cd5 \u8fd4\u56de\u4e0e\u63d2\u5165\u7684\u6bcf\u6761\u8bb0\u5f55\u76f8\u5bf9\u5e94\u7684 sObject \u5217\u8868\u3002<samp>Test.loadData<\/samp><\/p>\n\n\n\n<p>\u5728\u8c03\u7528\u6b64\u65b9\u6cd5\u4e4b\u524d\uff0c\u5fc5\u987b\u521b\u5efa\u9759\u6001\u8d44\u6e90\u3002 \u9759\u6001\u8d44\u6e90\u662f\u4ee5\u9017\u53f7\u5206\u9694\u7684\u6587\u4ef6\uff0c\u4ee5 .csv \u6269\u5c55\u540d\u7ed3\u5c3e\u3002 \u8be5\u6587\u4ef6\u5305\u542b\u6d4b\u8bd5\u8bb0\u5f55\u7684\u5b57\u6bb5\u540d\u79f0\u548c\u503c\u3002\u8fd9 \u6587\u4ef6\u7684\u7b2c\u4e00\u884c\u5fc5\u987b\u5305\u542b\u5b57\u6bb5\u540d\u79f0\uff0c\u968f\u540e\u7684\u884c \u884c\u662f\u5b57\u6bb5\u503c\u3002\u82e5\u8981\u4e86\u89e3\u6709\u5173\u9759\u6001\u8d44\u6e90\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a \u8bf7\u53c2\u9605 Salesforce \u8054\u673a\u5e2e\u52a9\u4e2d\u7684\u201c\u5b9a\u4e49\u9759\u6001\u8d44\u6e90\u201d\u3002\u521b\u5efa\u540e .csv \u6587\u4ef6\u7684\u9759\u6001\u8d44\u6e90\uff0c\u9759\u6001\u8d44\u6e90\u5c06\u662f \u5206\u914d\u4e86 MIME \u7c7b\u578b\u3002\u652f\u6301\u7684 MIME \u7c7b\u578b\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6587\u672c\/CSV<\/li>\n\n\n\n<li>\u5e94\u7528\u7a0b\u5e8f\/vnd.ms-excel<\/li>\n\n\n\n<li>application\/octet-stream<\/li>\n\n\n\n<li>\u6587\u672c\/\u7eaf\u6587\u672c<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>Test.loadData&nbsp;\u793a\u4f8b<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u6b65\u9aa4 \u7528\u4e8e\u521b\u5efa\u793a\u4f8b .csv \u6587\u4ef6\u548c\u9759\u6001\u8d44\u6e90\uff0c\u5e76\u8c03\u7528\u4ee5\u63d2\u5165\u6d4b\u8bd5\u8bb0\u5f55\u3002<\/p>\n\n\n\n<p><samp>Test.loadData<\/samp><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u6d4b\u8bd5\u8bb0\u5f55\u6570\u636e\u7684 .csv \u6587\u4ef6\u3002\u6b64\u793a\u4f8b .csv \u6587\u4ef6\u6709\u4e09\u4e2a \u5e10\u6237\u8bb0\u5f55\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u6b64\u793a\u4f8b\u5185\u5bb9\u521b\u5efa .csv \u6587\u4ef6\u3002<code>Name,Website,Phone,BillingStreet,BillingCity,BillingState,BillingPostalCode,BillingCountry sForceTest1,http:\/\/www.sforcetest1.com,(415) 901-7000,The Landmark @ One Market,San Francisco,CA,94105,US sForceTest2,http:\/\/www.sforcetest2.com,(415) 901-7000,The Landmark @ One Market Suite 300,San Francisco,CA,94105,US sForceTest3,http:\/\/www.sforcetest3.com,(415) 901-7000,1 Market St,San Francisco,CA,94105,US<\/code><\/li>\n\n\n\n<li>\u4e3a .csv \u6587\u4ef6\u521b\u5efa\u9759\u6001\u8d44\u6e90\uff1a\n<ol class=\"wp-block-list\" style=\"list-style-type:lower-alpha\">\n<li>\u5728\u201c\u8bbe\u7f6e\u201d\u4e2d\uff0c\u8f93\u5165\u201c\u5feb\u901f\u67e5\u627e\u201d\u6846\uff0c\u7136\u540e\u9009\u62e9\u201c<strong>\u9759\u6001\u8d44\u6e90<\/strong>\u201d\u3002<kbd>Static Resources<\/kbd><\/li>\n\n\n\n<li>\u5355\u51fb<strong>\u201c\u65b0\u5efa<\/strong>\u201d\u3002<\/li>\n\n\n\n<li>\u5c06\u9759\u6001\u8d44\u6e90\u547d\u540d\u4e3a \u3002<kbd>testAccounts<\/kbd><\/li>\n\n\n\n<li>\u9009\u62e9\u60a8\u521b\u5efa\u7684\u6587\u4ef6\u3002<\/li>\n\n\n\n<li>\u70b9\u51fb<strong>\u4fdd\u5b58<\/strong>\u3002<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>\u547c\u5165 \u7528\u4e8e\u586b\u5145\u6d4b\u8bd5\u5e10\u6237\u7684\u6d4b\u8bd5\u65b9\u6cd5\u3002<samp>Test.loadData<\/samp><code>@isTest private class DataUtil { static testmethod void testLoadData() { \/\/ Load the test accounts from the static resource List&lt;sObject&gt; ls = Test.loadData(Account.sObjectType, 'testAccounts'); \/\/ Verify that all 3 test accounts were created System.assert(ls.size() == 3); \/\/ Get first test account Account a1 = (Account)ls[0]; String acctName = a1.Name; System.debug(acctName); \/\/ Perform some testing using the test records } }<\/code><\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\">\u6d4b\u8bd5\u6570\u636e\u7684\u901a\u7528\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u7c7b \u521b\u9020<\/h1>\n\n\n\n<p>\u5e38\u89c1\u7684\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u7c7b\u662f\u516c\u5171\u6d4b\u8bd5\u7c7b\uff0c\u5b83\u4eec \u5305\u542b\u7528\u4e8e\u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u7684\u53ef\u91cd\u7528\u4ee3\u7801\u3002<\/p>\n\n\n\n<p>\u516c\u5171\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u7c7b\u4f7f\u7528\u6ce8\u91ca\u8fdb\u884c\u5b9a\u4e49\uff0c\u56e0\u6b64\u88ab\u6392\u9664\u5728\u7ec4\u7ec7\u4ee3\u7801\u5927\u5c0f\u9650\u5236\u4e4b\u5916\u5e76\u6267\u884c \u5728\u6d4b\u8bd5\u4e0a\u4e0b\u6587\u4e2d\u3002\u5b83\u4eec\u53ef\u4ee5\u7531\u6d4b\u8bd5\u65b9\u6cd5\u8c03\u7528\uff0c\u4f46\u4e0d\u80fd\u7531\u975e\u6d4b\u8bd5\u4ee3\u7801\u8c03\u7528\u3002<samp>IsTest<\/samp><\/p>\n\n\n\n<p>\u516c\u5171\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u7c7b\u4e2d\u7684\u65b9\u6cd5\u7684\u5b9a\u4e49\u65b9\u5f0f\u4e0e\u975e\u6d4b\u8bd5\u4e2d\u7684\u65b9\u6cd5\u76f8\u540c \u7c7b\u3002\u5b83\u4eec\u53ef\u4ee5\u63a5\u53d7\u53c2\u6570\u5e76\u8fd4\u56de\u503c\u3002\u5fc5\u987b\u58f0\u660e\u8fd9\u4e9b\u65b9\u6cd5 \u4f5c\u4e3a\u516c\u5171\u6216\u5168\u5c40\uff0c\u4ee5\u4fbf\u5bf9\u5176\u4ed6\u6d4b\u8bd5\u7c7b\u53ef\u89c1\u3002\u8fd9\u4e9b\u5e38\u7528\u65b9\u6cd5\u53ef\u4ee5\u662f \u7531 Apex \u7c7b\u4e2d\u7684\u4efb\u4f55\u6d4b\u8bd5\u65b9\u6cd5\u8c03\u7528\uff0c\u4ee5\u5728\u8fd0\u884c \u6d4b\u8bd5\u3002\u867d\u7136\u60a8\u53ef\u4ee5\u5728\u5e38\u89c4 Apex \u4e2d\u521b\u5efa\u7528\u4e8e\u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u7684\u516c\u5171\u65b9\u6cd5 \u7c7b\uff0c\u5982\u679c\u6ca1\u6709\u6ce8\u89e3\uff0c\u4f60 \u4e0d\u8981\u4ece\u7ec4\u7ec7\u4ee3\u7801\u5927\u5c0f\u4e2d\u6392\u9664\u6b64\u4ee3\u7801\u7684\u597d\u5904 \u9650\u5236\u3002<samp>IsTest<\/samp><\/p>\n\n\n\n<p>\u8fd9\u662f\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u7c7b\u7684\u4e00\u4e2a\u793a\u4f8b\u3002\u5b83\u5305\u542b\u4e00\u4e2a\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u63a5\u53d7 \u8981\u521b\u5efa\u7684\u5e10\u6237\u6570\u548c\u6bcf\u4e2a\u5e10\u6237\u7684\u8054\u7cfb\u4eba\u6570\u3002 \u4e0b\u4e00\u4e2a\u793a\u4f8b\u6f14\u793a\u4e00\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u8c03\u7528\u6b64\u65b9\u6cd5\u4ee5\u521b\u5efa \u4e00\u4e9b\u6570\u636e\u3002<samp>createTestRecords<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@IsTest\npublic class TestDataFactory {\n    public static void createTestRecords(Integer numAccts, Integer numContactsPerAcct) {\n        List&lt;Account&gt; accts = new List&lt;Account&gt;();\n        \n        for(Integer i=0;i&lt;numAccts;i++) {\n            Account a = new Account(Name='TestAccount' + i);\n            accts.add(a);\n        }\n        insert accts;\n        \n        List&lt;Contact&gt; cons = new List&lt;Contact&gt;();\n        for (Integer j=0;j&lt;numAccts;j++) {\n            Account acct = accts&#91;j];            \n            \/\/ For each account just inserted, add contacts\n            for (Integer k=numContactsPerAcct*j;k&lt;numContactsPerAcct*(j+1);k++) {\n                cons.add(new Contact(firstname='Test'+k,\n                                     lastname='Test'+k,\n                                     AccountId=acct.Id));\n            }\n        }\n        \/\/ Insert all contacts for all accounts\n        insert cons;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6b64\u7c7b\u4e2d\u7684\u6d4b\u8bd5\u65b9\u6cd5\u8c03\u7528\u6d4b\u8bd5\u5b9e\u7528\u7a0b\u5e8f\u65b9\u6cd5 \uff0c\u4ee5\u521b\u5efa 5 \u4e2a \u6d4b\u8bd5\u5e10\u6237\uff0c\u6bcf\u4e2a\u5e10\u6237\u6709\u4e09\u4e2a\u8054\u7cfb\u4eba\u3002<samp>createTestRecords<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@IsTest\nprivate class MyTestClass {\n    static testmethod void test1() {\n        TestDataFactory.createTestRecords(5,3);\n        \/\/ Run some tests\n    }\n}<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5<\/h1>\n\n\n\n<p><a><\/a>\u4f7f\u7528\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\uff08\u5e26\u6709 \u6ce8\u91ca\u7684\u65b9\u6cd5\uff09\u521b\u5efa\u4e00\u6b21\u6d4b\u8bd5\u8bb0\u5f55\uff0c\u7136\u540e\u518d\u521b\u5efa\u4e00\u6b21 \u5728\u6d4b\u8bd5\u7c7b\u7684\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u8bbf\u95ee\u5b83\u4eec\u3002\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u53ef\u4ee5\u662f \u5f53\u60a8\u9700\u8981\u4e3a\u6240\u6709\u6d4b\u8bd5\u65b9\u6cd5\u521b\u5efa\u53c2\u8003\u6216\u5148\u51b3\u6761\u4ef6\u6570\u636e\u65f6\uff0c\u53ef\u4ee5\u8282\u7701\u65f6\u95f4\uff0c \u6216\u6240\u6709\u6d4b\u8bd5\u65b9\u6cd5\u90fd\u64cd\u4f5c\u7684\u4e00\u7ec4\u901a\u7528\u8bb0\u5f55\u3002<samp>@testSetup<\/samp><\/p>\n\n\n\n<p id=\"testsetup_intro\"><a><\/a>\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u53ef\u4ee5\u51cf\u5c11\u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\uff0c\u5c24\u5176\u662f\u5728 \u60a8\u6b63\u5728\u5904\u7406\u8bb8\u591a\u8bb0\u5f55\u3002\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u4f7f\u60a8\u80fd\u591f\u521b\u5efa\u901a\u7528\u6d4b\u8bd5 \u8f7b\u677e\u9ad8\u6548\u5730\u83b7\u53d6\u6570\u636e\u3002\u901a\u8fc7\u4e3a\u73ed\u7ea7\u8bbe\u7f6e\u4e00\u6b21\u8bb0\u5f55\uff0c\u60a8\u4e0d\u9700\u8981 \u4e3a\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u91cd\u65b0\u521b\u5efa\u8bb0\u5f55\u3002\u6b64\u5916\uff0c\u56e0\u4e3a\u56de\u6eda\u7684\u8bb0\u5f55 \u5728\u6d4b\u8bd5\u8bbe\u7f6e\u671f\u95f4\u521b\u5efa\uff0c\u53d1\u751f\u5728\u6574\u4e2a\u7c7b\u6267\u884c\u7ed3\u675f\u65f6\uff0c \u51cf\u5c11\u56de\u6eda\u7684\u8bb0\u5f55\u6570\u3002\u56e0\u6b64\uff0c\u7cfb\u7edf\u8d44\u6e90\u662f \u4e0e\u521b\u5efa\u8fd9\u4e9b\u8bb0\u5f55\u5e76\u56de\u6eda\u8fd9\u4e9b\u8bb0\u5f55\u76f8\u6bd4\uff0c\u4f7f\u7528\u6548\u7387\u66f4\u9ad8 \u6bcf\u79cd\u6d4b\u8bd5\u65b9\u6cd5\u3002<\/p>\n\n\n\n<p id=\"testsetup_behavior\"><a><\/a>\u5982\u679c\u6d4b\u8bd5\u7c7b\u5305\u542b\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\uff0c\u5219\u6d4b\u8bd5 Framework \u9996\u5148\u6267\u884c\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\uff0c\u7136\u540e\u518d\u6267\u884c\u7c7b\u4e2d\u7684\u4efb\u4f55\u6d4b\u8bd5\u65b9\u6cd5\u3002 \u5728\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u4e2d\u521b\u5efa\u7684\u8bb0\u5f55\u53ef\u7528\u4e8e \u6d4b\u8bd5\u7c7b\uff0c\u5e76\u5728\u6d4b\u8bd5\u7c7b\u6267\u884c\u7ed3\u675f\u65f6\u56de\u6eda\u3002\u5982\u679c\u6d4b\u8bd5\u65b9\u6cd5 \u66f4\u6539\u8fd9\u4e9b\u8bb0\u5f55\uff0c\u4f8b\u5982\u8bb0\u5f55\u5b57\u6bb5\u66f4\u65b0\u6216\u8bb0\u5f55\u5220\u9664\uff0c\u8fd9\u4e9b\u66f4\u6539 \u5728\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u5b8c\u6210\u6267\u884c\u540e\u56de\u6eda\u3002\u4e0b\u4e00\u4e2a\u6267\u884c\u6d4b\u8bd5 \u65b9\u6cd5\u83b7\u53d6\u5bf9\u8fd9\u4e9b\u8bb0\u5f55\u7684\u539f\u59cb\u672a\u4fee\u6539\u72b6\u6001\u7684\u8bbf\u95ee\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8bed\u6cd5<\/h2>\n\n\n\n<p>\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u662f\u5728\u6d4b\u8bd5\u7c7b\u4e2d\u5b9a\u4e49\u7684\uff0c\u4e0d\u5e26\u4efb\u4f55\u53c2\u6570\uff0c\u4e5f\u4e0d\u8fd4\u56de \u4ef7\u503c\u3002\u4ee5\u4e0b\u662f\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u7684\u8bed\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@testSetup static void methodName() {\n\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u793a\u4f8b\u6f14\u793a\u5982\u4f55\u521b\u5efa\u4e00\u6b21\u6d4b\u8bd5\u8bb0\u5f55\uff0c\u7136\u540e\u5728 \u591a\u79cd\u6d4b\u8bd5\u65b9\u6cd5\u3002\u6b64\u5916\uff0c\u8be5\u793a\u4f8b\u8fd8\u663e\u793a\u4e86\u5982\u4f55\u5728 \u7b2c\u4e00\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u5c06\u56de\u6eda\uff0c\u5e76\u4e14\u4e0d\u9002\u7528\u4e8e\u7b2c\u4e8c\u4e2a\u6d4b\u8bd5 \u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\nprivate class CommonTestSetup {\n\n    @testSetup static void setup() {\n        \/\/ Create common test accounts\n        List&lt;Account&gt; testAccts = new List&lt;Account&gt;();\n        for(Integer i=0;i&lt;2;i++) {\n            testAccts.add(new Account(Name = 'TestAcct'+i));\n        }\n        insert testAccts;        \n    }\n    \n    @isTest static void testMethod1() {\n        \/\/ Get the first test account by using a SOQL query\n        Account acct = &#91;SELECT Id FROM Account WHERE Name='TestAcct0' LIMIT 1];\n        \/\/ Modify first account\n        acct.Phone = '555-1212';\n        \/\/ This update is local to this test method only.\n        update acct;\n        \n        \/\/ Delete second account\n        Account acct2 = &#91;SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];\n        \/\/ This deletion is local to this test method only.\n        delete acct2;\n        \n        \/\/ Perform some testing\n    }\n\n    @isTest static void testMethod2() {\n        \/\/ The changes made by testMethod1() are rolled back and \n        \/\/ are not visible to this test method.        \n        \/\/ Get the first account by using a SOQL query\n        Account acct = &#91;SELECT Phone FROM Account WHERE Name='TestAcct0' LIMIT 1];\n        \/\/ Verify that test account created by test setup method is unaltered.\n        System.assertEquals(null, acct.Phone);\n        \n        \/\/ Get the second account by using a SOQL query\n        Account acct2 = &#91;SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];\n        \/\/ Verify test account created by test setup method is unaltered.\n        System.assertNotEquals(null, acct2);\n        \n        \/\/ Perform some testing\n    }\n\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a><\/a>\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u4ec5\u652f\u6301 \u6d4b\u8bd5\u7c7b\u7684\u9ed8\u8ba4\u6570\u636e\u9694\u79bb\u6a21\u5f0f\u3002\u5982\u679c\u6d4b\u8bd5\u7c7b\u6216\u6d4b\u8bd5 \u65b9\u6cd5\u53ef\u4ee5\u4f7f\u7528\u6ce8\u91ca\u8bbf\u95ee\u7ec4\u7ec7\u6570\u636e\uff0c \u6b64\u7c7b\u4e0d\u652f\u6301\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u3002\u56e0\u4e3a\u6570\u636e\u9694\u79bb for tests \u53ef\u7528\u4e8e API \u7248\u672c 24.0 \u53ca\u66f4\u9ad8\u7248\u672c\u7684\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5 \u4e5f\u4ec5\u9002\u7528\u4e8e\u8fd9\u4e9b\u7248\u672c\u3002<samp>@isTest(SeeAllData=true)<\/samp><\/li>\n\n\n\n<li>\u6bcf\u4e2a\u6d4b\u8bd5\u7c7b\u53ea\u80fd\u6709\u4e00\u79cd\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u5728\u6267\u884c\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u671f\u95f4\u53d1\u751f\u81f4\u547d\u9519\u8bef\uff0c\u4f8b\u5982 \u7531 DML \u64cd\u4f5c\u6216\u65ad\u8a00\u5931\u8d25\u5bfc\u81f4\u7684\u5f02\u5e38\uff0c\u6574\u4e2a \u6d4b\u8bd5\u7c7b\u5931\u8d25\uff0c\u5e76\u4e14\u4e0d\u4f1a\u6267\u884c\u8be5\u7c7b\u4e2d\u7684\u5176\u4ed6\u6d4b\u8bd5\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u6d4b\u8bd5\u8bbe\u7f6e\u65b9\u6cd5\u8c03\u7528\u53e6\u4e00\u4e2a\u7c7b\u7684\u975e\u6d4b\u8bd5\u65b9\u6cd5\uff0c\u5219\u65e0\u4ee3\u7801 \u8986\u76d6\u7387\u662f\u9488\u5bf9\u975e\u6d4b\u8bd5\u65b9\u6cd5\u8ba1\u7b97\u7684\u3002<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u8fd0\u884c\u5355\u5143\u6d4b\u8bd5\u65b9\u6cd5<\/h1>\n\n\n\n<p>\u82e5\u8981\u9a8c\u8bc1 Apex \u4ee3\u7801\u7684\u529f\u80fd\uff0c\u8bf7\u6267\u884c\u5355\u5143\u6d4b\u8bd5\u3002\u60a8\u53ef\u4ee5\u8fd0\u884c Apex \u5728\u5f00\u53d1\u4eba\u5458\u63a7\u5236\u53f0\u3001\u8bbe\u7f6e\u548c Salesforce Visual \u6269\u5c55\u4e2d\u6d4b\u8bd5\u65b9\u6cd5 Studio Code\uff0c\u6216\u4f7f\u7528 API\u3002\u53ef\u4ee5\u8fd0\u884c\u8fd9\u4e9b\u5355\u5143\u6d4b\u8bd5\u5206\u7ec4\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7279\u5b9a\u7c7b\u4e2d\u7684\u90e8\u5206\u6216\u5168\u90e8\u65b9\u6cd5<\/li>\n\n\n\n<li>\u4e00\u7ec4\u7c7b\u4e2d\u7684\u90e8\u5206\u6216\u5168\u90e8\u65b9\u6cd5<\/li>\n\n\n\n<li>\u9884\u5b9a\u4e49\u7684\u7c7b\u5957\u4ef6\uff0c\u79f0\u4e3a\u6d4b\u8bd5\u5957\u4ef6<\/li>\n\n\n\n<li>\u7ec4\u7ec7\u4e2d\u7684\u6240\u6709\u5355\u5143\u6d4b\u8bd5<\/li>\n<\/ul>\n\n\n\n<p>\u82e5\u8981\u8fd0\u884c\u6d4b\u8bd5\uff0c\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u4efb\u4e00\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Salesforce \u7528\u6237\u754c\u9762<\/li>\n\n\n\n<li>\u9002\u7528\u4e8e Visual Studio \u7684 Salesforce \u6269\u5c55 \u6cd5\u5178<\/li>\n\n\n\n<li>\u95ea\u7535\u5e73\u53f0\u5f00\u53d1\u4eba\u5458 \u5b89\u6170<\/li>\n\n\n\n<li>The API<\/li>\n<\/ul>\n\n\n\n<p>\u4ece Salesforce \u7528\u6237\u754c\u9762\u542f\u52a8\u7684\u6240\u6709 Apex \u6d4b\u8bd5\uff08\u5305\u62ec Developer Console\uff09\u5f02\u6b65\u5e76\u884c\u8fd0\u884c\u3002Apex \u6d4b\u8bd5\u7c7b\u653e\u7f6e\u5728 \u7528\u4e8e\u6267\u884c\u7684 Apex \u4f5c\u4e1a\u961f\u5217\u3002\u53ef\u4ee5\u8fd0\u884c\u7684\u6700\u5927\u6d4b\u8bd5\u7c7b\u6570 \u6bcf 24 \u5c0f\u65f6\u662f 500 \u6216 10 \u4e58\u4ee5\u6d4b\u8bd5\u7c7b\u6570\u7684\u8f83\u5927\u503c \u5728\u7ec4\u7ec7\u4e2d\u3002\u5bf9\u4e8e\u6c99\u76d2\u548c Developer Edition \u7ec4\u7ec7\uff0c\u6b64\u9650\u5236\u66f4\u9ad8\uff0c\u5e76\u4e14\u662f 500 \u6216 20 \u4e2d\u7684\u8f83\u5927\u503c\u4e58\u4ee5\u7ec4\u7ec7\u4e2d\u7684\u6d4b\u8bd5\u7c7b\u6570\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u4f5c\u4e3a\u90e8\u7f72\u7684\u4e00\u90e8\u5206\u8fd0\u884c\u7684 Apex \u6d4b\u8bd5\u59cb\u7ec8\u540c\u6b65\u8fd0\u884c\uff0c\u5e76\u4e14 \u4e32\u884c\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u901a\u8fc7 Salesforce \u7528\u6237\u8fd0\u884c\u6d4b\u8bd5 \u63a5\u53e3<\/h2>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u5728 Apex \u6d4b\u8bd5\u6267\u884c\u9875\u9762\u4e0a\u8fd0\u884c\u5355\u5143\u6d4b\u8bd5\u3002\u5728\u6b64\u9875\u9762\u4e0a\u5f00\u59cb\u6d4b\u8bd5 \u5f02\u6b65\u8fd0\u884c\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u60a8\u4e0d\u5fc5\u7b49\u5f85\u6d4b\u8bd5\u7c7b\u6267\u884c \u5b8c\u6210\u3002\u201cApex Test Execution\u201d\uff08Apex \u6d4b\u8bd5\u6267\u884c\uff09\u9875\u9762\u5237\u65b0\u6d4b\u8bd5\u72b6\u6001\uff0c\u5e76\u663e\u793a \u6d4b\u8bd5\u5b8c\u6210\u540e\u7684\u7ed3\u679c\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/developer.salesforce.com\/docs\/resources\/img\/en-us\/246.0?doc_id=dev_guides%2Fapex%2Fimages%2Ftest_execution.png&amp;folder=apexcode\" alt=\"Apex \u6d4b\u8bd5\u6267\u884c\u9875\u9762\"\/><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728\u201c\u8bbe\u7f6e\u201d\u4e2d\uff0c\u8f93\u5165\u201c\u5feb\u901f\u67e5\u627e\u201d\u6846\uff0c\u7136\u540e\u9009\u62e9<strong>\u201cApex \u6d4b\u8bd5\u201d \u6267\u884c<\/strong>\u3002<kbd>Apex Test Execution<\/kbd><\/li>\n\n\n\n<li>\u5355\u51fb<strong>\u201c\u9009\u62e9\u6d4b\u8bd5&#8230;<\/strong>\u201d\u3002\u6ce8\u610f\u5982\u679c\u4f60 \u5177\u6709\u4ece\u6258\u7ba1\u5305\u5b89\u88c5\u7684 Apex \u7c7b\uff0c\u60a8\u5fc5\u987b \u9996\u5148\u901a\u8fc7\u5355\u51fb\u201c\u5168\u90e8\u7f16\u8bd1\u201d\u6765\u7f16\u8bd1\u8fd9\u4e9b\u7c7b<strong>&nbsp;<\/strong>Apex \u7c7b\u9875\u9762\u4e0a\u7684\u7c7b\uff0c\u4ee5\u4fbf\u5b83\u4eec\u663e\u793a\u5728 \u5217\u8868\u3002<\/li>\n\n\n\n<li>\u9009\u62e9\u8981\u8fd0\u884c\u7684\u6d4b\u8bd5\u3002\u6d4b\u8bd5\u5217\u8868\u4ec5\u5305\u62ec \u5305\u542b\u6d4b\u8bd5\u65b9\u6cd5\u3002<ul><li>\u82e5\u8981\u4ece\u5df2\u5b89\u88c5\u7684\u6258\u7ba1\u5305\u4e2d\u9009\u62e9\u6d4b\u8bd5\uff0c\u8bf7\u9009\u62e9 \u4e0b\u62c9\u5217\u8868\u4e2d\u6258\u7ba1\u5305\u7684\u76f8\u5e94\u547d\u540d\u7a7a\u95f4\u3002 \u4ec5\u5177\u6709\u6240\u9009\u547d\u540d\u7a7a\u95f4\u7684\u6258\u7ba1\u5305\u7684\u7c7b \u51fa\u73b0\u5728\u5217\u8868\u4e2d\u3002<\/li><li>\u82e5\u8981\u9009\u62e9\u7ec4\u7ec7\u4e2d\u672c\u5730\u5b58\u5728\u7684\u6d4b\u8bd5\uff0c\u8bf7\u4ece\u4e0b\u62c9\u5217\u8868\u4e2d\u9009\u62e9<strong>\u201c[\u6211\u7684\u547d\u540d\u7a7a\u95f4]<\/strong>\u201d\u3002 \u53ea\u6709\u4e0d\u662f\u6765\u81ea\u6258\u7ba1\u5305\u7684\u672c\u5730\u7c7b\u624d\u4f1a\u51fa\u73b0\u5728 \u5217\u8868\u3002<\/li><li>\u8981\u9009\u62e9\u4efb\u4f55\u6d4b\u8bd5\uff0c\u8bf7\u4ece\u4e0b\u62c9\u5217\u8868\u4e2d\u9009\u62e9<strong>[\u6240\u6709\u547d\u540d\u7a7a\u95f4]\u3002<\/strong>\u5c06\u663e\u793a\u7ec4\u7ec7\u4e2d\u7684\u6240\u6709\u7c7b\uff0c \u65e0\u8bba\u5b83\u4eec\u662f\u5426\u6765\u81ea\u6258\u7ba1\u5305\u3002<\/li><\/ul>\u6ce8\u610f\u5f53\u524d\u6b63\u5728\u8fd0\u884c\u6d4b\u8bd5\u7684\u7c7b\u4e0d\u4f1a\u51fa\u73b0\u5728 \u5217\u8868\u3002<\/li>\n\n\n\n<li>\u82e5\u8981\u9009\u62e9\u4e0d\u5728\u6d4b\u8bd5\u8fd0\u884c\u671f\u95f4\u6536\u96c6\u4ee3\u7801\u8986\u76d6\u7387\u4fe1\u606f\uff0c\u8bf7\u9009\u62e9\u201c<strong>\u8df3\u8fc7\u4ee3\u7801\u8986\u76d6\u7387<\/strong>\u201d\u3002<\/li>\n\n\n\n<li>\u5355\u51fb<strong>\u8fd0\u884c<\/strong>\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u4f7f\u7528 Apex Test Execution \u9875\u9762\u8fd0\u884c\u6d4b\u8bd5\u540e\uff0c\u60a8\u53ef\u4ee5\u67e5\u770b\u4ee3\u7801\u8986\u76d6\u7387 \u5f00\u53d1\u8005\u63a7\u5236\u53f0\u4e2d\u7684\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n\n\n\n<p>\u5728\u201c\u8bbe\u7f6e\u201d\u4e2d\uff0c\u8f93\u5165\u201c\u5feb\u901f\u67e5\u627e\u201d\u6846\uff0c\u9009\u62e9<strong>\u201cApex \u6d4b\u8bd5\u6267\u884c<\/strong>\u201d\uff0c\u7136\u540e\u5355\u51fb<strong>\u201c\u67e5\u770b\u201d \u6d4b\u8bd5\u5386\u53f2\u8bb0\u5f55<\/strong>\uff0c\u7528\u4e8e\u67e5\u770b\u7ec4\u7ec7\u7684\u6240\u6709\u6d4b\u8bd5\u7ed3\u679c\uff0c\u800c\u4e0d\u662f \u53ea\u662f\u60a8\u8fd0\u884c\u7684\u6d4b\u8bd5\u3002\u6d4b\u8bd5\u7ed3\u679c\u5728\u6d4b\u8bd5\u540e\u4fdd\u7559 30 \u5929 \u5b8c\u6210\u8fd0\u884c\uff0c\u9664\u975e\u6e05\u9664\u3002<kbd>Apex<\/kbd><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u4f7f\u7528 Salesforce \u6269\u5c55\u8fd0\u884c\u6d4b\u8bd5 \u9488\u5bf9 Visual Studio Code<\/h2>\n\n\n\n<p>\u53ef\u4ee5\u4f7f\u7528 Visual Studio Code \u6267\u884c\u6d4b\u8bd5\u3002\u8bf7\u53c2\u9605\u9002\u7528\u4e8e Visual Studio \u7684 Salesforce \u6269\u5c55 \u4ee3\u7801\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u4f7f\u7528 Lightning \u8fd0\u884c\u6d4b\u8bd5 \u5e73\u53f0\u5f00\u53d1\u4eba\u5458\u63a7\u5236\u53f0<\/h2>\n\n\n\n<p>\u5728\u5f00\u53d1\u8005\u63a7\u5236\u53f0\u4e2d\uff0c\u60a8\u53ef\u4ee5\u5728\u7279\u5b9a\u7684\u6d4b\u8bd5\u7c7b\u4e2d\u6267\u884c\u90e8\u5206\u6216\u5168\u90e8\u6d4b\u8bd5\uff0c \u8bbe\u7f6e\u548c\u8fd0\u884c\u6d4b\u8bd5\u5957\u4ef6\uff0c\u6216\u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\u3002\u5f00\u53d1\u8005\u63a7\u5236\u53f0\u8fd0\u884c\u6d4b\u8bd5 \u5728\u540e\u53f0\u5f02\u6b65\u8fd0\u884c\uff0c\u9664\u975e\u6d4b\u8bd5\u8fd0\u884c\u4ec5\u5305\u542b\u4e00\u4e2a\u7c7b\u548c \u4f60\u5c1a\u672a\u5728\u201c\u6d4b\u8bd5\u201d\u83dc\u5355\u4e2d\u9009\u62e9\u201c<strong>\u59cb\u7ec8\u5f02\u6b65\u8fd0\u884c<\/strong>\u201d\u3002 \u901a\u8fc7\u5f02\u6b65\u8fd0\u884c\u6d4b\u8bd5\uff0c\u60a8\u53ef\u4ee5\u5728\u5f00\u53d1\u8005\u63a7\u5236\u53f0\u7684\u5176\u4ed6\u533a\u57df\u5de5\u4f5c \u5728\u6d4b\u8bd5\u8fd0\u884c\u65f6\u3002\u6d4b\u8bd5\u5b8c\u6210\u6267\u884c\u540e\uff0c\u53ef\u4ee5\u68c0\u67e5\u6d4b\u8bd5 \u7ed3\u679c\u5728\u5f00\u53d1\u8005\u63a7\u5236\u53f0\u4e2d\u3002\u6b64\u5916\uff0c\u8fd8\u53ef\u4ee5\u68c0\u67e5\u6574\u4f53\u4ee3\u7801\u8986\u76d6\u7387 \u5bf9\u4e8e\u6d4b\u8bd5\u6db5\u76d6\u7684\u8bfe\u7a0b\u3002<\/p>\n\n\n\n<p>\u6709\u5173\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 Salesforce \u4e2d\u7684\u5f00\u53d1\u4eba\u5458\u63a7\u5236\u53f0\u6587\u6863 \u5e2e\u52a9\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u4f7f\u7528 API \u8fd0\u884c\u6d4b\u8bd5<\/h2>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528\u6765\u81ea SOAP \u7684\u8c03\u7528 \u7528\u4e8e\u8fd0\u884c\u6d4b\u8bd5\u7684 API \u540c\u6b65\u3002<\/p>\n\n\n\n<p><samp>runTests()<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RunTestsResult&#91;] runTests(RunTestsRequest ri)<\/code><\/pre>\n\n\n\n<p>\u6b64\u8c03\u7528\u5141\u8bb8\u60a8\u8fd0\u884c\u6240\u6709\u7c7b\u4e2d\u7684\u6240\u6709\u6d4b\u8bd5\uff0c\u4ee5\u53ca\u7279\u5b9a\u7c7b\u4e2d\u7684\u6240\u6709\u6d4b\u8bd5 \u547d\u540d\u7a7a\u95f4\uff0c\u6216\u6307\u5b9a\u7279\u5b9a\u547d\u540d\u7a7a\u95f4\u4e2d\u7c7b\u5b50\u96c6\u4e2d\u7684\u6240\u6709\u6d4b\u8bd5 \u5728 RunTestsRequest \u5bf9\u8c61\u4e2d\u3002\u5b83\u8fd4\u56de\u4ee5\u4e0b\u5185\u5bb9\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8fd0\u884c\u7684\u6d4b\u8bd5\u603b\u6570<\/li>\n\n\n\n<li>\u4ee3\u7801\u8986\u76d6\u7387\u7edf\u8ba1<\/li>\n\n\n\n<li>\u6bcf\u4e2a\u5931\u8d25\u6d4b\u8bd5\u7684\u9519\u8bef\u4fe1\u606f<\/li>\n\n\n\n<li>\u6bcf\u4e2a\u6210\u529f\u7684\u6d4b\u8bd5\u7684\u4fe1\u606f<\/li>\n\n\n\n<li>\u8fd0\u884c\u6d4b\u8bd5\u6240\u82b1\u8d39\u7684\u65f6\u95f4<\/li>\n<\/ul>\n\n\n\n<p>\u6709\u5173 \u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1 SOAP API \u4e2d\u7684\u00a0<samp>runTests\uff08\uff09<\/samp>\u00a0\u5f00\u53d1\u4eba\u5458\u6307\u5357\u3002<samp>runTests()<\/samp><\/p>\n\n\n\n<p>\u8fd8\u53ef\u4ee5\u4f7f\u7528\u5de5\u5177 REST API \u8fd0\u884c\u6d4b\u8bd5\u3002\u4f7f\u7528 \u548c \u7ec8\u7ed3\u70b9\u8fd0\u884c\u6d4b\u8bd5 \u5f02\u6b65\u6216\u540c\u6b65\u3002\u6709\u5173\u7528\u6cd5\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605<em>\u5de5\u5177 API<\/em>\uff1aREST \u8d44\u6e90\u3002<samp>\/runTestsAsynchronous\/\/runTestsSynchronous\/<\/samp><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u4f7f\u7528&nbsp;ApexTestQueueItem&nbsp;\u8fd0\u884c\u6d4b\u8bd5<\/h2>\n\n\n\n<p>\u53ef\u4ee5\u4f7f\u7528&nbsp;<samp>ApexTestQueueItem \u548c ApexTestResult<\/samp>&nbsp;\u5f02\u6b65\u8fd0\u884c\u6d4b\u8bd5\u3002\u8fd9\u4e9b\u5bf9\u8c61\u5141\u8bb8\u60a8 \u5c06\u6d4b\u8bd5\u6dfb\u52a0\u5230 Apex \u4f5c\u4e1a\u961f\u5217\uff0c\u5e76\u68c0\u67e5\u5df2\u5b8c\u6210\u7684\u6d4b\u8bd5\u8fd0\u884c\u7684\u7ed3\u679c\u3002 \u6b64\u8fc7\u7a0b\u4e0d\u4ec5\u4f7f\u4f60\u80fd\u591f\u5f02\u6b65\u542f\u52a8\u6d4b\u8bd5\uff0c\u8fd8\u4f7f\u4f60\u80fd\u591f\u5b89\u6392 \u4f7f\u7528 Apex \u8c03\u5ea6\u7a0b\u5e8f\u5728\u7279\u5b9a\u65f6\u95f4\u6267\u884c\u7684\u6d4b\u8bd5\u3002\u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605&nbsp;Apex Scheduler\u3002<\/p>\n\n\n\n<p>\u63d2\u5165\u4e00\u4e2a\u5bf9\u8c61\u4ee5\u653e\u7f6e\u5176 Apex \u4f5c\u4e1a\u961f\u5217\u4e2d\u76f8\u5e94\u7684 Apex \u7c7b\u4ee5\u4f9b\u6267\u884c\u3002Apex \u4f5c\u4e1a\u6267\u884c \u7c7b\u4e2d\u7684\u6d4b\u8bd5\u65b9\u6cd5\u3002\u4f5c\u4e1a\u6267\u884c\u540e\uff0c\u5305\u542b\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u7684\u7ed3\u679c \u4f5c\u4e3a\u6d4b\u8bd5\u7684\u4e00\u90e8\u5206\u6267\u884c\u3002<samp>ApexTestQueueItem<\/samp><samp>ApexTestResult<\/samp><\/p>\n\n\n\n<p>\u8981\u4e2d\u6b62 Apex \u4f5c\u4e1a\u961f\u5217\u4e2d\u7684\u7c7b\uff0c\u8bf7\u5728 ApexTestQueueItem \u5bf9\u8c61\uff0c\u5e76\u5c06\u5176&nbsp;Status&nbsp;\u5b57\u6bb5\u8bbe\u7f6e\u4e3a \u3002<kbd>Aborted<\/kbd><\/p>\n\n\n\n<p>\u5982\u679c\u5728\u5355\u4e2a\u6279\u91cf\u64cd\u4f5c\u4e2d\u63d2\u5165\u591a\u4e2a Apex \u6d4b\u8bd5\u961f\u5217\u9879\uff0c\u5219\u961f\u5217 \u9879\u76ee\u5171\u4eab\u76f8\u540c\u7684\u7236\u4f5c\u4e1a\u3002\u8fd9\u610f\u5473\u7740\u6d4b\u8bd5\u8fd0\u884c\u53ef\u4ee5\u5305\u62ec \u5982\u679c\u63d2\u5165\u4e86\u6240\u6709\u6d4b\u8bd5\u961f\u5217\u9879\uff0c\u5219\u6267\u884c\u591a\u4e2a\u7c7b\u7684\u6d4b\u8bd5 \u5728\u76f8\u540c\u7684\u6279\u91cf\u64cd\u4f5c\u4e2d\u3002<\/p>\n\n\n\n<p>\u53ef\u4ee5\u5728 Apex \u4f5c\u4e1a\u961f\u5217\u662f 500 \u6216 10 \u4e58\u4ee5\u6d4b\u8bd5\u7c7b\u6570\u4e2d\u7684\u8f83\u5927\u503c \u5728\u7ec4\u7ec7\u4e2d\u3002\u5bf9\u4e8e\u6c99\u76d2\u548c Developer Edition \u7ec4\u7ec7\uff0c\u6b64\u9650\u5236\u66f4\u9ad8 \u5e76\u4e14\u662f 500 \u6216 20 \u4e2d\u7684\u8f83\u5927\u503c\u4e58\u4ee5 \u7ec4\u7ec7\u3002\u6b64\u793a\u4f8b\u4f7f\u7528 DML \u64cd\u4f5c\u63d2\u5165\u548c\u67e5\u8be2 \u548c \u5bf9\u8c61\u3002\u8be5\u65b9\u6cd5\u4e3a\u4ee5 \u6d4b\u8bd5\u3002\u7136\u540e\uff0c\u5b83\u8fd4\u56de\u4e00\u4e2a\u961f\u5217\u9879\u7684\u7236\u4f5c\u4e1a ID\uff0c\u8be5 ID \u5bf9\u4e8e\u6240\u6709\u961f\u5217\u9879\u90fd\u662f\u76f8\u540c\u7684 \u5bf9\u9879\u76ee\u8fdb\u884c\u6392\u961f\uff0c\u56e0\u4e3a\u5b83\u4eec\u662f\u6279\u91cf\u63d2\u5165\u7684\u3002\u8be5\u65b9\u6cd5\u68c0\u7d22\u5bf9\u5e94\u4e8e \u6307\u5b9a\u7684\u4f5c\u4e1a ID\u3002\u7136\u540e\uff0c\u5b83\u67e5\u8be2\u5e76\u8f93\u51fa\u540d\u79f0\u3001\u4f5c\u4e1a\u72b6\u6001\u548c\u4f20\u9012 \u6bcf\u4e2a\u73ed\u7ea7\u7684\u8d39\u7387\u3002\u8be5\u65b9\u6cd5\u83b7\u53d6\u4f5c\u4e3a \u5de5\u4f5c\u3002<\/p>\n\n\n\n<p><samp>ApexTestQueueItem<\/samp><samp>ApexTestResult<\/samp><samp>enqueueTests<\/samp><samp>checkClassStatus<\/samp><samp>checkMethodStatus<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class TestUtil {\n\n    \/\/ Enqueue all classes ending in \"Test\". \n    public static ID enqueueTests() {\n        ApexClass&#91;] testClasses = \n           &#91;SELECT Id FROM ApexClass \n            WHERE Name LIKE '%Test'];\n        if (testClasses.size() &gt; 0) {\n            ApexTestQueueItem&#91;] queueItems = new List&lt;ApexTestQueueItem&gt;();\n            for (ApexClass cls : testClasses) {\n                queueItems.add(new ApexTestQueueItem(ApexClassId=cls.Id));\n            }\n\n            insert queueItems;\n\n            \/\/ Get the job ID of the first queue item returned.\n            ApexTestQueueItem item = \n               &#91;SELECT ParentJobId FROM ApexTestQueueItem \n                WHERE Id=:queueItems&#91;0].Id LIMIT 1];\n            return item.parentjobid;\n        }\n        return null;\n    }\n\n    \/\/ Get the status and pass rate for each class\n    \/\/ whose tests were run by the job.\n    \/\/ that correspond to the specified job ID.\n    public static void checkClassStatus(ID jobId) {\n        ApexTestQueueItem&#91;] items = \n           &#91;SELECT ApexClass.Name, Status, ExtendedStatus \n            FROM ApexTestQueueItem \n            WHERE ParentJobId=:jobId];\n        for (ApexTestQueueItem item : items) {\n            String extStatus = item.extendedstatus == null ? '' : item.extendedStatus;\n            System.debug(item.ApexClass.Name + ': ' + item.Status + extStatus);\n        }\n    }\n\n    \/\/ Get the result for each test method that was executed.\n    public static void checkMethodStatus(ID jobId) {\n        ApexTestResult&#91;] results = \n           &#91;SELECT Outcome, ApexClass.Name, MethodName, Message, StackTrace \n            FROM ApexTestResult \n            WHERE AsyncApexJobId=:jobId];\n        for (ApexTestResult atr : results) {\n            System.debug(atr.ApexClass.Name + '.' + atr.MethodName + ': ' + atr.Outcome);\n            if (atr.message != null) {\n                System.debug(atr.Message + '\\n at ' + atr.StackTrace);\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f7f\u7528 runAs \u65b9\u6cd5<\/li>\n\n\n\n<li>\u4f7f\u7528 Limits\u3001startTest \u548c stopTest<\/li>\n\n\n\n<li>\u5c06 SOSL \u67e5\u8be2\u6dfb\u52a0\u5230\u5355\u5143\u6d4b\u8bd5<\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528&nbsp;runAs&nbsp;\u65b9\u6cd5<\/h1>\n\n\n\n<p>\u901a\u5e38\uff0c\u6240\u6709 Apex \u4ee3\u7801\u90fd\u8fd0\u884c\u5728\u7cfb\u7edf\u6a21\u5f0f\u4e0b\uff0c\u5176\u4e2d\u6743\u9650\u548c\u8bb0\u5f55\u5171\u4eab \u7684\u5f53\u524d\u7528\u6237\u4e0d\u88ab\u8003\u8651\u5728\u5185\u3002\u4f7f\u7528\u7cfb\u7edf\u65b9\u6cd5\uff0c\u53ef\u4ee5\u7f16\u5199\u66f4\u6539\u7684\u6d4b\u8bd5\u65b9\u6cd5 \u73b0\u6709\u7528\u6237\u6216\u65b0\u7528\u6237\u7684\u7528\u6237\u4e0a\u4e0b\u6587\uff0c\u4ee5\u4fbf\u7528\u6237\u7684\u8bb0\u5f55 \u5f3a\u5236\u6267\u884c\u5171\u4eab\u3002\u8be5\u65b9\u6cd5\u5f3a\u5236\u6267\u884c \u8bb0\u5f55 \u5171\u4eab\u3002 \u7528\u6237\u6743\u9650\u548c\u5b57\u6bb5\u7ea7\u6743\u9650\u5c06\u5e94\u7528\u4e8e\u65b0\u7684\u4e0a\u4e0b\u6587\u7528\u6237\uff0c\u56e0\u4e3a \u5728\u5f3a\u5236\u6267\u884c\u5bf9\u8c61\u548c\u5b57\u6bb5\u6743\u9650\u4e2d\u8fdb\u884c\u4e86\u63cf\u8ff0\u3002<samp>runAsrunAs<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u65e0\u8bba\u6d4b\u8bd5\u7c7b\u7684\u5171\u4eab\u6a21\u5f0f\u5982\u4f55\uff0c\u90fd\u4f1a\u5728\u5757\u5185\u5f3a\u5236\u6267\u884c\u7528\u6237\u7684\u5171\u4eab\u6743\u9650\u3002\u5982\u679c \u5728\u5757\u4e2d\u8c03\u7528\u7528\u6237\u5b9a\u4e49\u7684\u65b9\u6cd5\uff0c \u5f3a\u5236\u6267\u884c\u7684\u5171\u4eab\u6a21\u5f0f\u662f\u5b9a\u4e49\u65b9\u6cd5\u7684\u7c7b\u7684\u5171\u4eab\u6a21\u5f0f\u3002<samp>runAs<\/samp><samp>runAs<\/samp><\/p>\n\n\n\n<p>\u60a8\u53ea\u80fd\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u4f7f\u7528\u3002\u8fd9 \u5b8c\u6210\u6240\u6709\u6d4b\u8bd5\u65b9\u6cd5\u540e\uff0c\u5c06\u518d\u6b21\u542f\u52a8\u539f\u59cb\u7cfb\u7edf\u4e0a\u4e0b\u6587\u3002<samp>runAs<\/samp><samp>runAs<\/samp><\/p>\n\n\n\n<p>\u8be5\u65b9\u6cd5\u5ffd\u7565\u7528\u6237\u8bb8\u53ef\u8bc1\u9650\u5236\u3002\u4f60 \u80fd \u521b\u9020 \u5373\u4f7f\u4f60\u7684\u7ec4\u7ec7\u6ca1\u6709 \u5176\u4ed6\u7528\u6237\u8bb8\u53ef\u8bc1\u3002<samp>runAs<\/samp><samp>runAs<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u6bcf\u4e2a\u8c03\u7528\u90fd\u5f88\u91cd\u8981 \u76f8\u5bf9\u4e8e\u6d41\u7a0b\u4e2d\u53d1\u51fa\u7684 DML \u8bed\u53e5\u603b\u6570\u3002<samp>runAs<\/samp><\/p>\n\n\n\n<p>\u5728\u4ee5\u4e0b\u793a\u4f8b\u4e2d\uff0c\u5c06\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6d4b\u8bd5\u7528\u6237\uff0c\u7136\u540e\u4ee5\u8be5\u7528\u6237\u8eab\u4efd\u8fd0\u884c\u4ee3\u7801\uff0c\u5176\u4e2d \u8be5\u7528\u6237\u7684\u8bb0\u5f55\u5171\u4eab\u8bbf\u95ee\u6743\u9650\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\nprivate class TestRunAs {\n   public static testMethod void testRunAs() {\n        \/\/ Setup test data\n        \/\/ Create a unique UserName\n        String uniqueUserName = 'standarduser' + DateTime.now().getTime() + '@testorg.com';\n        \/\/ This code runs as the system user\n        Profile p = &#91;SELECT Id FROM Profile WHERE Name='Standard User'];\n        User u = new User(Alias = 'standt', Email='standarduser@testorg.com',\n        EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',\n        LocaleSidKey='en_US', ProfileId = p.Id,\n        TimeZoneSidKey='America\/Los_Angeles',\n         UserName=uniqueUserName);\n\n        System.runAs(u) {\n              \/\/ The following code runs as user 'u'\n              System.debug('Current User: ' + UserInfo.getUserName());\n              System.debug('Current Profile: ' + UserInfo.getProfileId());\n          }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u53ef\u4ee5\u5d4c\u5957\u591a\u4e2a\u65b9\u6cd5\u3002\u4e3a \u4f8b\uff1a<samp>runAs<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\nprivate class TestRunAs2 {\n\n   public static testMethod void test2() {\n\n      Profile p = &#91;SELECT Id FROM Profile WHERE Name='Standard User'];\n      User u2 = new User(Alias = 'newUser', Email='newuser@testorg.com',\n         EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',\n         LocaleSidKey='en_US', ProfileId = p.Id,\n         TimeZoneSidKey='America\/Los_Angeles', UserName='newuser@testorg.com');\n\n      System.runAs(u2) {\n         \/\/ The following code runs as user u2.\n         System.debug('Current User: ' + UserInfo.getUserName());\n         System.debug('Current Profile: ' + UserInfo.getProfileId());\n\n         \/\/ The following code runs as user u3.\n         User u3 = &#91;SELECT Id FROM User WHERE UserName='newuser@testorg.com'];\n         System.runAs(u3) {\n            System.debug('Current User: ' + UserInfo.getUserName());\n            System.debug('Current Profile: ' + UserInfo.getProfileId());\n         }\n\n         \/\/ Any additional code here would run as user u2.\n      }\n   }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">runAs&nbsp;\u7684\u5176\u4ed6\u7528\u9014<\/h2>\n\n\n\n<p>\u60a8\u8fd8\u53ef\u4ee5\u4f7f\u7528\u8be5\u65b9\u6cd5\u6765\u6267\u884c \u901a\u8fc7\u5c06 DML \u64cd\u4f5c\u5c01\u95ed\u5728\u5757\u4e2d\uff0c\u5728\u6d4b\u8bd5\u4e2d\u6df7\u5408 DML \u64cd\u4f5c\u3002\u8fd9\u6837\uff0c\u60a8\u5c31\u53ef\u4ee5\u7ed5\u8fc7\u6df7\u5408 DML \u5728\u63d2\u5165\u6216\u66f4\u65b0\u5b89\u88c5\u5bf9\u8c61\u65f6\u8fd4\u56de\u7684\u9519\u8bef \u5176\u4ed6 sObjects\u3002\u8bf7\u53c2\u89c1\u4e0d\u80fd\u4e00\u8d77\u4f7f\u7528\u7684 sObjects \u5728 DML \u64cd\u4f5c\u4e2d\u3002<samp>runAsrunAs<\/samp><\/p>\n\n\n\n<p><samp>runAs<\/samp>\u00a0\u65b9\u6cd5 \uff08<samp>runAs\uff08System.Version\uff09\uff09<\/samp>\u00a0\u7684\u53e6\u4e00\u4e2a\u91cd\u8f7d\u5c06\u5305\u7248\u672c\u4f5c\u4e3a\u53c2\u6570\u3002\u8fd9 \u65b9\u6cd5\u5bfc\u81f4\u4f7f\u7528\u7279\u5b9a\u7248\u672c\u7684\u6258\u7ba1\u5305\u7684\u4ee3\u7801\u3002\u4e3a \u6709\u5173\u4f7f\u7528\u00a0<samp>runAs<\/samp>\u00a0\u65b9\u6cd5\u548c \u6307\u5b9a\u5305\u7248\u672c\u4e0a\u4e0b\u6587\uff0c\u8bf7\u53c2\u9605\u6d4b\u8bd5\u5305\u4e2d\u7684\u884c\u4e3a \u7248\u672c\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528 Limits\u3001startTest&nbsp;\u548c&nbsp;stopTest<\/h1>\n\n\n\n<p>Limits \u65b9\u6cd5\u8fd4\u56de\u7279\u5b9a\u8c03\u63a7\u5668\u7684\u7279\u5b9a\u9650\u5236\uff0c\u4f8b\u5982\u6570\u5b57 \u65b9\u6cd5\u7684\u8c03\u7528\u6b21\u6570\u6216\u5269\u4f59\u7684\u5806\u5927\u5c0f\u91cf\u3002<\/p>\n\n\n\n<p>\u6bcf\u79cd\u65b9\u6cd5\u90fd\u6709\u4e24\u4e2a\u7248\u672c\u3002\u7b2c\u4e00\u4e2a\u7248\u672c\u8fd4\u56de\u5177\u6709 \u5728\u5f53\u524d\u4e0a\u4e0b\u6587\u4e2d\u4f7f\u7528\u3002\u7b2c\u4e8c\u4e2a\u7248\u672c\u5305\u542b\u201c\u9650\u5236\u201d\u4e00\u8bcd \u5e76\u8fd4\u56de\u53ef\u7528\u4e8e\u8be5\u4e0a\u4e0b\u6587\u7684\u8d44\u6e90\u603b\u91cf\u3002\u4f8b\u5982\uff0c\u5c06\u6807\u6ce8\u6570\u8fd4\u56de\u5230 \u5df2\u5728\u5f53\u524d\u4e0a\u4e0b\u6587\u4e2d\u5904\u7406\u7684\u5916\u90e8\u670d\u52a1\uff0c\u800c\u8fd4\u56de\u6807\u6ce8\u7684\u603b\u6570 \u5728\u7ed9\u5b9a\u7684\u4e0a\u4e0b\u6587\u4e2d\u53ef\u7528\u3002<samp>getCallouts<\/samp><samp>getLimitCallouts<\/samp><\/p>\n\n\n\n<p>\u9664\u4e86 Limits \u65b9\u6cd5\u4e4b\u5916\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528 \u548c \u65b9\u6cd5\u6765\u9a8c\u8bc1\u4ee3\u7801\u7684\u63a5\u8fd1\u7a0b\u5ea6 \u662f\u8fbe\u5230\u8c03\u901f\u5668\u9650\u5236\u3002<samp>startTest<\/samp><samp>stopTest<\/samp><\/p>\n\n\n\n<p>\u8be5\u65b9\u6cd5\u6807\u8bb0\u6d4b\u8bd5\u4e2d\u7684\u70b9 \u5728\u6d4b\u8bd5\u5b9e\u9645\u5f00\u59cb\u65f6\u7f16\u5199\u4ee3\u7801\u3002\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u53ea\u5141\u8bb8\u8c03\u7528\u6b64\u65b9\u6cd5 \u4e00\u6b21\u3002\u6b64\u65b9\u6cd5\u4e4b\u524d\u7684\u6240\u6709\u4ee3\u7801\u90fd\u5e94\u7528\u4e8e\u521d\u59cb\u5316\u53d8\u91cf\u3001\u586b\u5145\u6570\u636e \u7ed3\u6784\u7b49\uff0c\u5141\u8bb8\u60a8\u8bbe\u7f6e\u8fd0\u884c\u6d4b\u8bd5\u6240\u9700\u7684\u4e00\u5207\u3002\u4efb\u4f55\u4ee3\u7801 \u5728\u8c03\u7528\u4e4b\u540e\u6267\u884c\uff0c\u5e76\u5728\u8c03\u7528\u4e4b\u524d\u6267\u884c\uff0c\u5206\u914d\u4e86\u4e00\u7ec4\u65b0\u7684\u8c03\u63a7\u5668 \u9650\u5236\u3002<samp>startTest<\/samp><samp>startTest<\/samp><samp>stopTest<\/samp><\/p>\n\n\n\n<p>\u8be5\u65b9\u6cd5\u4e0d\u4f1a\u5237\u65b0 \u6d4b\u8bd5\uff1a\u5b83\u4e3a\u6d4b\u8bd5\u6dfb\u52a0\u4e0a\u4e0b\u6587\u3002\u4f8b\u5982\uff0c\u5982\u679c\u60a8\u7684\u7c7b\u8fdb\u884c 98 \u6b21 SOQL \u67e5\u8be2 \u5728\u5b83\u8c03\u7528\u4e4b\u524d\uff0c\u7b2c\u4e00\u4e2a\u91cd\u8981\u7684 \u540e\u9762\u7684\u8bed\u53e5\u662f DML \u8bed\u53e5\uff0c \u7a0b\u5e8f\u73b0\u5728\u53ef\u4ee5\u8fdb\u884c\u989d\u5916\u7684 100 \u6b21\u67e5\u8be2\u3002\u4f46\u662f\uff0c\u4e00\u65e6\u88ab\u8c03\u7528\uff0c\u7a0b\u5e8f\u5c31\u4f1a\u8fd4\u56de\u5230\u539f\u59cb\u4e0a\u4e0b\u6587\uff0c\u5e76\u4e14 \u5728\u8fbe\u5230 100 \u4e2a\u9650\u5236\u4e4b\u524d\uff0c\u53ea\u80fd\u8fdb\u884c 2 \u4e2a\u989d\u5916\u7684 SOQL \u67e5\u8be2\u3002<samp>startTest<\/samp><samp>startTest<\/samp><samp>startTest<\/samp><samp>stopTest<\/samp><\/p>\n\n\n\n<p><a><\/a>\u5f53\u6d4b\u8bd5\u7ed3\u675f\u65f6\uff0c\u8be5\u65b9\u6cd5\u5728\u6d4b\u8bd5\u4ee3\u7801\u4e2d\u6807\u8bb0\u8be5\u70b9\u3002<samp>stopTest<\/samp>\u5728 \u4e0e\u65b9\u6cd5\u7ed3\u5408\u4f7f\u7528\u3002\u6bcf\u6b21\u6d4b\u8bd5 \u65b9\u6cd5\u53ea\u5141\u8bb8\u8c03\u7528\u6b64\u65b9\u6cd5\u4e00\u6b21\u3002\u5728\u4e3a\u65b9\u6cd5\u5206\u914d\u539f\u59cb\u9650\u5236\u540e\u6267\u884c\u7684\u4efb\u4f55\u4ee3\u7801 \u5b9e\u9645\u4e0a\u4e4b\u524d\u88ab\u8c03\u7528\u4e86\u3002\u90fd \u5728\u8be5\u65b9\u6cd5\u4e4b\u540e\u8fdb\u884c\u7684\u5f02\u6b65\u8c03\u7528\u662f \u7531\u7cfb\u7edf\u6536\u96c6\u3002<samp>startTest<\/samp><samp>stopTest<\/samp><samp>startTest<\/samp><samp>startTest<\/samp><a><\/a>\u6267\u884c\u65f6\uff0c\u5c06\u8fd0\u884c\u6240\u6709\u5f02\u6b65\u8fdb\u7a0b \u540c\u6b65\u3002<samp>stopTest<\/samp><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u5c06 SOSL \u67e5\u8be2\u6dfb\u52a0\u5230\u5355\u5143\u6d4b\u8bd5<\/h1>\n\n\n\n<p>\u4e3a\u786e\u4fdd\u6d4b\u8bd5\u65b9\u6cd5\u59cb\u7ec8\u4ee5\u53ef\u9884\u6d4b\u7684\u65b9\u5f0f\u8fd0\u884c\uff0c\u4efb\u4f55 Salesforce \u5bf9\u8c61 \u6dfb\u52a0\u5230 Apex \u6d4b\u8bd5\u65b9\u6cd5\u7684\u641c\u7d22\u8bed\u8a00 \uff08SOSL\uff09 \u67e5\u8be2\u5c06\u8fd4\u56de\u4e00\u7ec4\u7a7a\u7684 \u6d4b\u8bd5\u65b9\u6cd5\u6267\u884c\u65f6\u7684\u641c\u7d22\u7ed3\u679c\u3002\u5982\u679c\u60a8\u4e0d\u5e0c\u671b\u67e5\u8be2\u8fd4\u56de \u7ed3\u679c\u5217\u8868\u4e3a\u7a7a\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u7cfb\u7edf\u65b9\u6cd5\u5b9a\u4e49\u8bb0\u5f55 ID \u5217\u8868\uff0c\u8be5 \u7531\u641c\u7d22\u8fd4\u56de\u3002\u7a0d\u540e\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u53d1\u751f\u7684\u6240\u6709 SOSL \u67e5\u8be2 \u8fd4\u56de\u65b9\u6cd5\u6307\u5b9a\u7684\u8bb0\u5f55 ID \u5217\u8868\u3002\u6b64\u5916\uff0c\u6d4b\u8bd5\u65b9\u6cd5\u53ef\u4ee5\u591a\u6b21\u8c03\u7528 \u4e3a\u4e0d\u540c\u7684 SOSL \u67e5\u8be2\u5b9a\u4e49\u4e0d\u540c\u7684\u7ed3\u679c\u96c6\u3002\u5982\u679c\u672a\u5728\u6d4b\u8bd5\u65b9\u6cd5\u4e2d\u8c03\u7528\u8be5\u65b9\u6cd5\uff0c\u6216\u8005 \u5982\u679c\u5728\u672a\u6307\u5b9a\u8bb0\u5f55 ID \u5217\u8868\u7684\u60c5\u51b5\u4e0b\u8c03\u7528\u6b64\u65b9\u6cd5\uff0c\u5219\u4efb\u4f55 SOSL \u67e5\u8be2 place later in the test \u65b9\u6cd5\u8fd4\u56de\u4e00\u4e2a\u7a7a\u7684\u7ed3\u679c\u5217\u8868\u3002<samp>Test.setFixedSearchResults<\/samp><samp>Test.setFixedSearchResults<\/samp><samp>Test.setFixedSearchResults<\/samp><samp>Test.setFixedSearchResults<\/samp><\/p>\n\n\n\n<p>\u8be5\u65b9\u6cd5\u6307\u5b9a\u7684\u8bb0\u5f55 ID \u5217\u8868\u5c06\u66ff\u6362\u901a\u5e38 \u5982\u679c SOSL \u67e5\u8be2\u4e0d\u53d7\u4efb\u4f55 OR \u5b50\u53e5\u7684\u7ea6\u675f\uff0c\u5219\u7531 SOSL \u67e5\u8be2\u8fd4\u56de\u3002\u5982\u679c\u8fd9\u4e9b \u5b50\u53e5\u5b58\u5728\u4e8e SOSL \u67e5\u8be2\u4e2d\uff0c\u5b83\u4eec\u5e94\u7528\u4e8e\u56fa\u5b9a\u641c\u7d22\u7ed3\u679c\u5217\u8868\u3002\u4e3a \u4f8b\uff1a<samp>Test.setFixedSearchResults<\/samp><samp>WHERE<\/samp><samp>LIMIT<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\nprivate class SoslFixedResultsTest1 {\n\n    public static testMethod void testSoslFixedResults() {\n       Id &#91;] fixedSearchResults= new Id&#91;1];\n       fixedSearchResults&#91;0] = '001x0000003G89h';\n       Test.setFixedSearchResults(fixedSearchResults);\n       List&lt;List&lt;SObject&gt;&gt; searchList = &#91;FIND 'test' \n                                         IN ALL FIELDS RETURNING \n                                            Account(id, name WHERE name = 'test' LIMIT 1)];\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>ContentDocument \uff08File\uff09 \u6216&nbsp;ContentNote&nbsp;\uff08Note\uff09 \u5b9e\u4f53\u7684 SOSL \u67e5\u8be2\u9700\u8981\u4e0e&nbsp;ContentVersion&nbsp;ID \u4e00\u8d77\u4f7f\u7528\uff0c\u4ee5\u4fbf\u4e0e Salesforce \u7d22\u5f15\u7684\u65b9\u5f0f\u4fdd\u6301\u4e00\u81f4 \u5e76\u641c\u7d22\u6587\u4ef6\u548c\u7b14\u8bb0\u3002<samp>setFixedSearchResults<\/samp><\/p>\n\n\n\n<p>\u5c3d\u7ba1 ID \u4e3a \u7684\u5ba2\u6237\u8bb0\u5f55\u53ef\u80fd\u4e0e FIND \u5b50\u53e5 \uff08\uff09 \u4e2d\u7684\u67e5\u8be2\u5b57\u7b26\u4e32\u4e0d\u5339\u914d\uff0c\u4f46\u8be5\u8bb0\u5f55\u5c06\u4f20\u9012\u5230 SOSL \u8bed\u53e5\u7684\u5b50\u53e5\u4e2d\u3002\u5982\u679c\u8bb0\u5f55 \u5982\u679c ID \u4e0e\u5b50\u53e5\u7b5b\u9009\u5668\u5339\u914d\uff0c\u5219\u8fd4\u56de\u8bb0\u5f55\u3002\u5982\u679c\u662f\u8fd9\u6837 \u4e0d\u5339\u914d\u5b50\u53e5\uff0c\u65e0\u8bb0\u5f55 \u8fd4\u56de\u3002<samp>001x0000003G89h<\/samp><samp>&#8216;test&#8217;<\/samp><samp>RETURNING<\/samp><samp>001x0000003G89h<\/samp><samp>WHERE<\/samp><samp>WHERE<\/samp><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5<\/h1>\n\n\n\n<p>\u597d\u7684\u6d4b\u8bd5\u53ef\u4ee5\u505a\u5230\u4ee5\u4e0b\u51e0\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8986\u76d6\u5c3d\u53ef\u80fd\u591a\u7684\u4ee3\u7801\u884c\u3002\u5728\u90e8\u7f72 Apex\u00a0\u6216 \u5c06\u5176\u6253\u5305\u4e3a AppExchange\uff0c\u5219\u5fc5\u987b\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u3002\u91cd\u8981<ul><li>\u5355\u5143\u6d4b\u8bd5\u5fc5\u987b\u8986\u76d6\u81f3\u5c11 75% \u7684 Apex \u4ee3\u7801\uff0c\u4ee5\u53ca\u6240\u6709 \u8fd9\u4e9b\u6d4b\u8bd5\u5fc5\u987b\u6210\u529f\u5b8c\u6210\u3002<\/li><li>\u6bcf\u4e2a\u89e6\u53d1\u5668\u90fd\u5fc5\u987b\u5177\u6709\u4e00\u5b9a\u7684\u6d4b\u8bd5\u8986\u76d6\u7387\u3002<\/li><li>\u6240\u6709\u7c7b\u548c\u89e6\u53d1\u5668\u90fd\u5fc5\u987b\u6210\u529f\u7f16\u8bd1\u3002<\/li><\/ul>\u8bf7\u6ce8\u610f\u4ee5\u4e0b\u4e8b\u9879\u3002\n<ul class=\"wp-block-list\">\n<li>\u5c06 Apex \u90e8\u7f72\u5230\u751f\u4ea7\u7ec4\u7ec7\u65f6\uff0c\u6bcf\u4e2a \u7ec4\u7ec7\u547d\u540d\u7a7a\u95f4\u4e2d\u7684\u5355\u5143\u6d4b\u8bd5\u7531 \u8fdd\u7ea6\u3002<\/li>\n\n\n\n<li><a><\/a>\u8c03\u7528\u4e0d\u8ba1\u5165 Apex \u4ee3\u7801\u7684\u4e00\u90e8\u5206 \u8986\u76d6\u3002<samp>System.debug<\/samp><\/li>\n\n\n\n<li>\u6d4b\u8bd5\u65b9\u6cd5\u548c\u6d4b\u8bd5\u7c7b\u4e0d\u8ba1\u5165 Apex \u4ee3\u7801\u8986\u76d6\u7387\u3002<\/li>\n\n\n\n<li>\u867d\u7136\u53ea\u6709 75% \u7684 Apex \u4ee3\u7801\u5fc5\u987b\u88ab \u6d4b\u8bd5\uff0c\u4e0d\u8981\u5173\u6ce8\u4ee3\u7801\u7684\u767e\u5206\u6bd4 \u8986\u76d6\u3002\u76f8\u53cd\uff0c\u8bf7\u786e\u4fdd\u4f60\u7684\u6bcf\u4e2a\u7528\u4f8b \u6db5\u76d6\u5e94\u7528\uff0c\u5305\u62ec\u6b63\u9762\u548c\u8d1f\u9762 \u6848\u4f8b\uff0c\u4ee5\u53ca\u6279\u91cf\u548c\u5355\u6761\u8bb0\u5f55\u3002\u8fd9\u79cd\u65b9\u6cd5 \u786e\u4fdd 75% \u6216\u66f4\u591a\u7684\u4ee3\u7801\u88ab\u5355\u5143\u8986\u76d6 \u6d4b\u8bd5\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u5982\u679c\u4ee3\u7801\u4f7f\u7528\u6761\u4ef6\u903b\u8f91\uff08\u5305\u62ec\u4e09\u5143\u8fd0\u7b97\u7b26\uff09\uff0c\u8bf7\u6267\u884c\u6bcf\u4e2a\u5206\u652f\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528\u6709\u6548\u548c\u65e0\u6548\u8f93\u5165\u8c03\u7528\u65b9\u6cd5\u3002<\/li>\n\n\n\n<li>\u6210\u529f\u5b8c\u6210\u800c\u4e0d\u4f1a\u5f15\u53d1\u4efb\u4f55\u5f02\u5e38\uff0c\u9664\u975e\u8fd9\u4e9b\u9519\u8bef\u662f\u9884\u671f\u7684 \u5e76\u88ab\u56f0\u5728\u4e00\u4e2a\u8857\u533a\u3002<samp>try\u2026catch<\/samp><\/li>\n\n\n\n<li>\u59cb\u7ec8\u5904\u7406\u6355\u83b7\u7684\u6240\u6709\u5f02\u5e38\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u6355\u83b7 \u5f02\u5e38\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528\u65b9\u6cd5\u8bc1\u660e\u4ee3\u7801 \u884c\u4e3a\u6b63\u5e38\u3002<samp>System.assert<\/samp><\/li>\n\n\n\n<li>\u4f7f\u7528\u8be5\u65b9\u6cd5\u6d4b\u8bd5\u5e94\u7528\u7a0b\u5e8f \u5728\u4e0d\u540c\u7684\u7528\u6237\u4e0a\u4e0b\u6587\u4e2d\u3002<samp>runAs<\/samp><\/li>\n\n\n\n<li>\u7ec3\u4e60\u6279\u91cf\u89e6\u53d1\u5668\u529f\u80fd &#8211; \u5728\u6d4b\u8bd5\u4e2d\u4f7f\u7528\u81f3\u5c11 20 \u6761\u8bb0\u5f55\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528\u5173\u952e\u5b57\u786e\u4fdd \u8bb0\u5f55\u6309\u9884\u671f\u987a\u5e8f\u8fd4\u56de\u3002<samp>ORDER BY<\/samp><\/li>\n\n\n\n<li>\u4e0d\u5047\u5b9a\u8bb0\u5f55 ID \u6309\u987a\u5e8f\u6392\u5217\u3002\u8bb0\u5f55 ID \u4e0d\u662f\u5728 \u5347\u5e8f\uff0c\u9664\u975e\u60a8\u4f7f\u7528\u540c\u4e00\u8bf7\u6c42\u63d2\u5165\u591a\u6761\u8bb0\u5f55\u3002\u4f8b\u5982 \u5982\u679c\u60a8\u521b\u5efa\u4e86\u4e00\u4e2a\u5e10\u6237 A\uff0c\u5e76\u63a5\u6536\u4e86 ID\uff0c\u5219\u521b\u5efa\u5e10\u6237 B\uff0c\u5219\u5e10\u6237 B \u7684 ID \u53ef\u80fd\u4f1a\uff0c\u4e5f\u53ef\u80fd\u4e0d\u4f1a \u4f9d\u6b21\u8d70\u9ad8\u3002<samp>001D000000IEEmT<\/samp><\/li>\n\n\n\n<li>\u8bbe\u7f6e\u6d4b\u8bd5\u6570\u636e\uff1a\n<ul class=\"wp-block-list\">\n<li>\u5728\u6d4b\u8bd5\u7c7b\u4e2d\u521b\u5efa\u5fc5\u8981\u7684\u6570\u636e\uff0c\u4ee5\u4fbf\u6d4b\u8bd5\u4e0d\u5fc5\u4f9d\u8d56\u6570\u636e \u5728\u7279\u5b9a\u7ec4\u7ec7\u4e2d\u3002<\/li>\n\n\n\n<li>\u5728\u8c03\u7528\u65b9\u6cd5\u4e4b\u524d\u521b\u5efa\u6240\u6709\u6d4b\u8bd5\u6570\u636e\u3002<samp>Test.startTest<\/samp><\/li>\n\n\n\n<li>\u7531\u4e8e\u6d4b\u8bd5\u4e0d\u63d0\u4ea4\uff0c\u56e0\u6b64\u65e0\u9700\u5220\u9664\u4efb\u4f55\u6570\u636e\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u5199\u8bc4\u8bba\uff0c\u4e0d\u4ec5\u8981\u8bf4\u660e\u5e94\u8be5\u6d4b\u8bd5\u7684\u5185\u5bb9\uff0c\u8fd8\u8981\u8bf4\u660e\u5047\u8bbe \u6d4b\u8bd5\u4eba\u5458\u5bf9\u6570\u636e\u3001\u9884\u671f\u7ed3\u679c\u7b49\u8fdb\u884c\u4e86\u6d4b\u8bd5\u3002<\/li>\n\n\n\n<li>\u5355\u72ec\u6d4b\u8bd5\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u7c7b\u3002\u6c38\u8fdc\u4e0d\u8981\u6d4b\u8bd5\u4f60\u7684\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f \u4e00\u6b21\u6d4b\u8bd5\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u82e5\u8981\u4fdd\u62a4\u6570\u636e\u7684\u9690\u79c1\uff0c\u8bf7\u786e\u4fdd\u6d4b\u8bd5\u9519\u8bef\u6d88\u606f\u548c\u5f02\u5e38 \u8be6\u7ec6\u4fe1\u606f\u4e0d\u5305\u542b\u4efb\u4f55\u4e2a\u4eba\u6570\u636e\u3002Apex \u5f02\u5e38\u5904\u7406\u7a0b\u5e8f\u548c\u6d4b\u8bd5 \u6846\u67b6\u65e0\u6cd5\u786e\u5b9a\u654f\u611f\u6570\u636e\u662f\u5426\u5305\u542b\u5728\u7528\u6237\u5b9a\u4e49\u7684\u6d88\u606f\u4e2d\uff0c\u5e76\u4e14 \u8be6\u3002\u8981\u5728\u81ea\u5b9a\u4e49 Apex \u4f8b\u5916\u4e2d\u5305\u542b\u4e2a\u4eba\u6570\u636e\uff0c\u6211\u4eec\u5efa\u8bae\u60a8 \u521b\u5efa\u4e00\u4e2a\u5177\u6709\u65b0\u5c5e\u6027\u7684 Exception \u5b50\u7c7b\uff0c\u7528\u4e8e\u4fdd\u5b58\u4e2a\u4eba\u6570\u636e\u3002\u7136\u540e \u4e0d\u8981\u5728\u5f02\u5e38\u7684\u6d88\u606f\u5b57\u7b26\u4e32\u4e2d\u5305\u542b\u5b50\u7c7b\u5c5e\u6027\u4fe1\u606f\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u8981\u8fd0\u884c\u8bb8\u591a\u6d4b\u8bd5\uff0c\u8bf7\u6d4b\u8bd5\u7ec4\u7ec7\u4e2d\u7684\u7c7b \u5728 Salesforce \u7528\u6237\u754c\u9762\u4e2d\u5355\u72ec\u4f7f\u7528\uff0c\u800c\u4e0d\u662f\u4f7f\u7528<strong>\u201c\u5168\u90e8\u8fd0\u884c\u201d \u201c\u6d4b\u8bd5<\/strong>\u201d\u6309\u94ae\u5c06\u5b83\u4eec\u4e00\u8d77\u8fd0\u884c\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5e76\u884c\u6d4b\u8bd5\u6267\u884c\u7684\u6700\u4f73\u5b9e\u8df5<\/h2>\n\n\n\n<p>\u4ece Salesforce \u7528\u6237\u754c\u9762\uff08\u5305\u62ec\u5f00\u53d1\u4eba\u5458\u63a7\u5236\u53f0\uff09\u542f\u52a8\u7684\u6d4b\u8bd5 \u5e76\u884c\u8fd0\u884c\u3002\u5e76\u884c\u6d4b\u8bd5\u6267\u884c\u53ef\u4ee5\u52a0\u5feb\u6d4b\u8bd5\u8fd0\u884c\u65f6\u95f4\u3002\u6709\u65f6\uff0c\u5e76\u884c \u6d4b\u8bd5\u6267\u884c\u4f1a\u5bfc\u81f4\u6570\u636e\u4e89\u7528\u95ee\u9898\uff0c\u60a8\u53ef\u4ee5\u5728 \u90a3\u4e9b\u60c5\u51b5\u3002\u5177\u4f53\u800c\u8a00\uff0c\u5728\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u53ef\u80fd\u4f1a\u53d1\u751f\u6570\u636e\u4e89\u7528\u95ee\u9898\u548c\u9519\u8bef\uff1a<\/p>\n\n\n\n<p><samp>UNABLE_TO_LOCK_ROW<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f53\u6d4b\u8bd5\u540c\u65f6\u66f4\u65b0\u76f8\u540c\u7684\u8bb0\u5f55\u65f6\u3002\u66f4\u65b0\u76f8\u540c\u7684\u8bb0\u5f55 \u901a\u5e38\u5728\u6d4b\u8bd5\u4e0d\u521b\u5efa\u81ea\u5df1\u7684\u6570\u636e\u5e76\u5173\u95ed\u6570\u636e\u65f6\u53d1\u751f \u9694\u79bb\u4ee5\u8bbf\u95ee\u7ec4\u7ec7\u7684\u6570\u636e\u3002<\/li>\n\n\n\n<li>\u5f53\u5e76\u884c\u8fd0\u884c\u5e76\u5c1d\u8bd5\u521b\u5efa \u5177\u6709\u91cd\u590d\u7d22\u5f15\u5b57\u6bb5\u503c\u7684\u8bb0\u5f55\u3002\u5f53\u4e24\u4e2a\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\u53d1\u751f\u65f6\uff0c\u4f1a\u53d1\u751f\u6b7b\u9501 \u7b49\u5f85\u5f7c\u6b64\u56de\u6eda\u6570\u636e\u3002\u5982\u679c\u63d2\u5165\u4e24\u4e2a\u6d4b\u8bd5\uff0c\u5219\u53ef\u80fd\u4f1a\u53d1\u751f\u8fd9\u79cd\u7b49\u5f85 \u4ee5\u4e0d\u540c\u987a\u5e8f\u5177\u6709\u76f8\u540c\u552f\u4e00\u7d22\u5f15\u5b57\u6bb5\u503c\u7684\u8bb0\u5f55\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u901a\u8fc7\u5728 Salesforce \u7528\u6237\u754c\u9762\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728\u201c\u8bbe\u7f6e\u201d\u4e2d\uff0c\u8f93\u5165 \u3002<kbd>Apex Test<\/kbd><\/li>\n\n\n\n<li>\u5355\u51fb<strong>\u201c\u9009\u9879&#8230;<\/strong>\u201d\u3002<\/li>\n\n\n\n<li>\u5728\u201cApex \u6d4b\u8bd5\u6267\u884c\u9009\u9879\u201d\u5bf9\u8bdd\u6846\u4e2d\uff0c\u9009\u62e9<strong>\u201c\u7981\u7528\u5e76\u884c Apex\u201d \u201c\u6d4b\u8bd5<\/strong>\u201d\uff0c\u7136\u540e\u5355\u51fb\u201c<strong>\u786e\u5b9a<\/strong>\u201d\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u5e26\u6279\u6ce8\u7684\u6d4b\u8bd5\u7c7b\u6307\u793a\u6d4b\u8bd5\u7c7b\u53ef\u4ee5\u540c\u65f6\u8fd0\u884c\uff0c\u5e76\u4e14\u8d85\u8fc7\u9ed8\u8ba4\u6570\u91cf \u5e76\u53d1\u6d4b\u8bd5\u7c7b\u3002\u6b64\u6279\u6ce8\u5c06\u8986\u76d6\u9ed8\u8ba4\u8bbe\u7f6e\u3002<samp>IsTest(IsParallel=true)<\/samp><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u6d4b\u8bd5\u5b9e\u4f8b<\/h1>\n\n\n\n<p>\u4ee5\u4e0b\u793a\u4f8b\u5305\u62ec\u4ee5\u4e0b\u7c7b\u578b\u7684\u6848\u4f8b \u6d4b\u8bd5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5177\u6709\u5355\u6761\u548c\u591a\u6761\u8bb0\u5f55\u7684\u9633\u6027\u75c5\u4f8b<\/li>\n\n\n\n<li>\u5355\u6761\u548c\u591a\u6761\u8bb0\u5f55\u7684\u8d1f\u6570\u5927\u5c0f\u5199<\/li>\n\n\n\n<li>\u4e0e\u5176\u4ed6\u7528\u6237\u4e00\u8d77\u6d4b\u8bd5<\/li>\n<\/ul>\n\n\n\n<p>\u8be5\u6d4b\u8bd5\u4e0e\u7b80\u5355\u7684\u91cc\u7a0b\u8ddf\u8e2a\u5e94\u7528\u7a0b\u5e8f\u4e00\u8d77\u4f7f\u7528\u3002\u73b0\u6709\u4ee3\u7801 \u5e94\u7528\u7a0b\u5e8f\u9a8c\u8bc1\u4e00\u5929\u5185\u8f93\u5165\u7684\u91cc\u7a0b\u4e0d\u8d85\u8fc7 500 \u82f1\u91cc\u3002\u8fd9 \u4e3b\u8981\u5bf9\u8c61\u662f\u540d\u4e3a Mileage__c \u7684\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u8be5\u6d4b\u8bd5\u521b\u5efa\u4e00\u6761\u5305\u542b 300 \u7684\u8bb0\u5f55 \u82f1\u91cc\u5e76\u9a8c\u8bc1\u4ec5\u8bb0\u5f55\u4e86 300 \u82f1\u91cc\u3002\u7136\u540e\u5faa\u73af\u521b\u5efa 200 \u6761\u8bb0\u5f55 \u6bcf\u4eba\u4e00\u82f1\u91cc\u3002\u6700\u540e\uff0c\u5b83\u9a8c\u8bc1\u603b\u5171\u8bb0\u5f55\u4e86 500 \u82f1\u91cc\uff08 \u539f\u6765\u7684 300 \u52a0\u4e0a\u65b0\u7684\uff09\u3002\u8fd9\u662f\u6574\u4e2a\u6d4b\u8bd5\u7c7b\u3002\u4ee5\u4e0b\u5404\u8282 \u5355\u6b65\u6267\u884c\u4ee3\u7801\u7684\u7279\u5b9a\u90e8\u5206\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\nprivate class MileageTrackerTestSuite {\n\n    static testMethod void runPositiveTestCases() {\n        \n        Double totalMiles = 0;\n        final Double maxtotalMiles = 500;\n        final Double singletotalMiles = 300;\n        final Double u2Miles = 100;\n  \n        \n        \/\/Set up user\n        User u1 = &#91;SELECT Id FROM User WHERE Alias='auser'];\n        \n        \/\/Run As U1\n        System.RunAs(u1){\n\n            \n        System.debug('Inserting 300  miles... (single record validation)');\n        \n        Mileage__c testMiles1 = new Mileage__c(Miles__c = 300, Date__c = System.today());\n        insert testMiles1;\n        \n        \/\/Validate single insert\n        for(Mileage__c m:&#91;SELECT miles__c FROM Mileage__c \n            WHERE CreatedDate = TODAY\n            and CreatedById = :u1.id\n            and miles__c != null]) {\n                totalMiles += m.miles__c;\n            }\n        \n        Assert.areEqual(singletotalMiles, totalMiles);\n    \n    \n        \/\/Bulk validation   \n        totalMiles = 0; \n        System.debug('Inserting 200 mileage records... (bulk validation)');\n        \n        List&lt;Mileage__c&gt; testMiles2 = new List&lt;Mileage__c&gt;();\n        for(integer i=0; i&lt;200; i++) {\n            testMiles2.add( new Mileage__c(Miles__c = 1, Date__c = System.today()) );\n        }\n        insert testMiles2;\n       \n        for(Mileage__c m:&#91;SELECT miles__c FROM Mileage__c\n            WHERE CreatedDate = TODAY\n            and CreatedById = :u1.Id\n            and miles__c != null]) {\n                totalMiles += m.miles__c;\n            }\n        \n        Assert.areEqual(maxtotalMiles, totalMiles);\n\n        }\/\/end RunAs(u1)\n\n\n       \/\/Validate additional user:\n       totalMiles = 0;\n       \/\/Setup RunAs\n       User u2 = &#91;SELECT Id FROM User WHERE Alias='tuser'];\n       System.RunAs(u2){\n        \n        Mileage__c testMiles3 = new Mileage__c(Miles__c = 100, Date__c = System.today());\n        insert testMiles3;\n        \n                for(Mileage__c m:&#91;SELECT miles__c FROM Mileage__c\n            WHERE CreatedDate = TODAY\n            and CreatedById = :u2.Id\n            and miles__c != null]) {\n                totalMiles += m.miles__c;\n            }\n        \/\/Validate \n        Assert.areEqual(u2Miles, totalMiles);\n        \n       } \/\/System.RunAs(u2)\n\n      \n    } \/\/ runPositiveTestCases()\n   \n    static testMethod void runNegativeTestCases() {\n\n        User u3 = &#91;SELECT Id FROM User WHERE Alias='tuser'];\n        System.RunAs(u3) {\n\n           System.debug('Inserting a record with 501 miles... (negative test case)'); \n\n           Mileage__c testMiles3 = new Mileage__c( Miles__c = 501, Date__c = System.today() );\n\n           try {\n               insert testMiles3;\n               Assert.fail('DmlException expected');\n           } catch (DmlException e) {\n               \/\/Assert Status Code\n               Assert.areEqual('FIELD_CUSTOM_VALIDATION_EXCEPTION', e.getDmlStatusCode(0));\n            \n               \/\/Assert field\n               Assert.areEqual(Mileage__c.Miles__c, e.getDmlFields(0)&#91;0]);\n                        \n               \/\/Assert Error Message\n               Assert.isTrue(e.getMessage().contains(\n                'Mileage request exceeds daily limit(500): &#91;Miles__c]'),\n                'DMLException did not contain expected validation message:' + e.getMessage() );\n            \n             } \/\/catch\n           } \/\/RunAs(u3) \n    } \/\/ runNegativeTestCases() \n  \n    \n} \/\/ class MileageTrackerTestSuite<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u9633\u6027\u6d4b\u8bd5\u7528\u4f8b<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u6b65\u9aa4\u901a\u8fc7\u4e0a\u9762\u7684\u4ee3\u7801\uff0c\u7279\u522b\u662f\uff0c \u5355\u6761\u8bb0\u5f55\u548c\u591a\u6761\u8bb0\u5f55\u7684\u9633\u6027\u6d4b\u8bd5\u7528\u4f8b\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c06\u6587\u672c\u6dfb\u52a0\u5230\u8c03\u8bd5\u65e5\u5fd7\u4e2d\uff0c\u6307\u793a\u4ee3\u7801\u7684\u4e0b\u4e00\u6b65\uff1a<code>System.debug('Inserting 300 more miles...single record validation');<\/code><\/li>\n\n\n\n<li>\u521b\u5efa\u4e00\u4e2aMileage__c\u5bf9\u8c61\u5e76\u5c06\u5176\u63d2\u5165\u5230\u6570\u636e\u5e93\u4e2d\u3002<code>Mileage__c testMiles1 = new Mileage__c(Miles__c = 300, Date__c = System.today() ); insert testMiles1;<\/code><\/li>\n\n\n\n<li>\u901a\u8fc7\u8fd4\u56de\u63d2\u5165\u7684\u8bb0\u5f55\u6765\u9a8c\u8bc1\u4ee3\u7801\uff1a<code>for(Mileage__c m:[SELECT miles__c FROM Mileage__c WHERE CreatedDate = TODAY and CreatedById = :createdbyId and miles__c != null]) { totalMiles += m.miles__c; }<\/code><\/li>\n\n\n\n<li>\u4f7f\u7528\u8be5\u65b9\u6cd5\u9a8c\u8bc1 \u9884\u671f\u7ed3\u679c\u662f \u8fd4\u56de\uff1a<samp>Assert.areEqual<\/samp><code>Assert.areEqual(singletotalMiles, totalMiles);<\/code><\/li>\n\n\n\n<li>\u5728\u8fdb\u5165\u4e0b\u4e00\u4e2a\u6d4b\u8bd5\u4e4b\u524d\uff0c\u8bf7\u8bbe\u7f6e\u603b\u91cc\u7a0b\u6570 \u8fd4\u56de 0\uff1a<code>totalMiles = 0;<\/code><\/li>\n\n\n\n<li>\u901a\u8fc7\u521b\u5efa 200 \u6761\u8bb0\u5f55\u7684\u6279\u91cf\u63d2\u5165\u6765\u9a8c\u8bc1\u4ee3\u7801\u3002\u9996\u5148\uff0c\u5728\u8c03\u8bd5\u65e5\u5fd7\u4e2d\u6dfb\u52a0\u6587\u672c\uff0c\u6307\u793a\u4e0b\u4e00\u6b65 \u6cd5\u5178\uff1a<code>System.debug('Inserting 200 Mileage records...bulk validation');<\/code><\/li>\n\n\n\n<li>\u7136\u540e\u63d2\u5165 200 \u6761Mileage__c\u8bb0\u5f55\uff1a<code>List&lt;Mileage__c&gt; testMiles2 = new List&lt;Mileage__c&gt;(); for(Integer i=0; i&lt;200; i++){ testMiles2.add( new Mileage__c(Miles__c = 1, Date__c = System.today()) ); } insert testMiles2;<\/code><\/li>\n\n\n\n<li>\u7528\u4e8e\u9a8c\u8bc1\u9884\u671f\u7ed3\u679c \u662f \u8fd4\u56de\uff1a<samp>Assert.areEqual<\/samp><code>for(Mileage__c m:[SELECT miles__c FROM Mileage__c WHERE CreatedDate = TODAY and CreatedById = :CreatedbyId and miles__c != null]) { totalMiles += m.miles__c; } Assert.areEqual(maxtotalMiles, totalMiles);<\/code><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u9634\u6027\u6d4b\u8bd5\u7528\u4f8b<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u6b65\u9aa4\u901a\u8fc7\u4e0a\u9762\u7684\u4ee3\u7801\uff0c\u7279\u522b\u662f\uff0c \u9634\u6027\u6d4b\u8bd5\u7528\u4f8b\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a \uff1a<samp>runNegativeTestCases<\/samp><code>static testMethod void runNegativeTestCases(){<\/code><\/li>\n\n\n\n<li>\u5c06\u6587\u672c\u6dfb\u52a0\u5230\u8c03\u8bd5\u65e5\u5fd7\u4e2d\uff0c\u6307\u793a\u4ee3\u7801\u7684\u4e0b\u4e00\u6b65\uff1a<code>System.debug('Inserting 501 miles... negative test case');<\/code><\/li>\n\n\n\n<li>\u521b\u5efa 501 \u82f1\u91cc\u7684Mileage__c\u8bb0\u5f55\u3002<code>Mileage__c testMiles3 = new Mileage__c(Miles__c = 501, Date__c = System.today());<\/code><\/li>\n\n\n\n<li>\u5c06\u8bed\u53e5\u653e\u5728 \/ \u5757\u4e2d\u3002\u8fd9\u5141\u8bb8\u60a8\u6355\u83b7\u9a8c\u8bc1\u5f02\u5e38\u548c \u65ad\u8a00\u751f\u6210\u7684\u9519\u8bef\u6d88\u606f\u3002\u4f7f\u7528\u8be5\u65b9\u6cd5\u660e\u786e\u65ad\u8a00\u60a8\u671f\u671b \u9a8c\u8bc1\u5f02\u5e38\u3002<samp>insert<\/samp><samp>try<\/samp><samp>catch<\/samp><samp>Assert.fail<\/samp><code>try { insert testMiles3; Assert.fail('DmlException expected'); } catch (DmlException e) {<\/code><\/li>\n\n\n\n<li>\u73b0\u5728\u4f7f\u7528 \u548c \u65b9\u6cd5\u8fdb\u884c\u6d4b\u8bd5\u3002 \u5c06\u4ee5\u4e0b\u4ee3\u7801\u6dfb\u52a0\u5230\u4e4b\u524d\u7684\u5757\u4e2d \u521b\u5efa\uff1a<samp>Assert.areEqual<\/samp><samp>Assert.isTrue<\/samp><samp>catch<\/samp><code>\/\/Assert Status Code Assert.areEqual('FIELD_CUSTOM_VALIDATION_EXCEPTION', e.getDmlStatusCode(0)); \/\/Assert field Assert.areEqual(Mileage__c.Miles__c, e.getDmlFields(0)[0]); \/\/Assert Error Message Assert.isTrue(e.getMessage().contains( 'Mileage request exceeds daily limit(500): [Miles__c]'), 'DMLException did not contain expected validation message:' + e.getMessage() );<\/code><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u4ee5\u7b2c\u4e8c\u7528\u6237\u8eab\u4efd\u8fdb\u884c\u6d4b\u8bd5<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u6b65\u9aa4\u901a\u8fc7\u4e0a\u9762\u7684\u4ee3\u7801\uff0c\u7279\u522b\u662f\uff0c \u4ee5\u7b2c\u4e8c\u4e2a\u7528\u6237\u8eab\u4efd\u8fd0\u884c\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728\u8fdb\u5165\u4e0b\u4e00\u4e2a\u6d4b\u8bd5\u4e4b\u524d\uff0c\u8bf7\u8bbe\u7f6e\u603b\u91cc\u7a0b\u6570 \u8fd4\u56de 0\uff1a<code>totalMiles = 0;<\/code><\/li>\n\n\n\n<li>\u8bbe\u7f6e\u4e0b\u4e00\u4e2a\u7528\u6237\u3002<code>User u2 = [SELECT Id FROM User WHERE Alias='tuser']; System.RunAs(u2){<\/code><\/li>\n\n\n\n<li>\u5c06\u6587\u672c\u6dfb\u52a0\u5230\u8c03\u8bd5\u65e5\u5fd7\u4e2d\uff0c\u6307\u793a\u4ee3\u7801\u7684\u4e0b\u4e00\u6b65\uff1a<code>System.debug('Setting up testing - deleting any mileage records for ' + UserInfo.getUserName() + ' from today');<\/code><\/li>\n\n\n\n<li>\u7136\u540e\u63d2\u5165\u4e00\u6761Mileage__c\u8bb0\u5f55\uff1a<code>Mileage__c testMiles3 = new Mileage__c(Miles__c = 100, Date__c = System.today()); insert testMiles3;<\/code><\/li>\n\n\n\n<li>\u901a\u8fc7\u8fd4\u56de\u63d2\u5165\u7684\u8bb0\u5f55\u6765\u9a8c\u8bc1\u4ee3\u7801\uff1a<code>for(Mileage__c m:[SELECT miles__c FROM Mileage__c WHERE CreatedDate = TODAY and CreatedById = :u2.Id and miles__c != null]) { totalMiles += m.miles__c; }<\/code><\/li>\n\n\n\n<li>\u4f7f\u7528\u8be5\u65b9\u6cd5\u9a8c\u8bc1 \u9884\u671f\u7ed3\u679c\u662f \u8fd4\u56de\uff1a<samp>Assert.areEqual<\/samp><code>Assert.areEqual(u2Miles, totalMiles);<\/code><\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\">\u6d4b\u8bd5\u548c\u4ee3\u7801\u8986\u76d6\u7387<\/h1>\n\n\n\n<p>Apex \u6d4b\u8bd5\u6846\u67b6\u4e3a\u60a8\u7684 Apex \u7c7b\u751f\u6210\u4ee3\u7801\u8986\u76d6\u7387\u6570\u5b57\uff0c\u5e76\u4e14 \u6bcf\u6b21\u8fd0\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u6d4b\u8bd5\u65f6\u89e6\u53d1\u3002\u4ee3\u7801\u8986\u76d6\u7387\u6307\u793a\u6709\u591a\u5c11\u53ef\u6267\u884c\u884c \u7c7b\u548c\u89e6\u53d1\u5668\u4e2d\u7684\u4ee3\u7801\u5df2\u7531\u6d4b\u8bd5\u65b9\u6cd5\u6267\u884c\u3002\u5c06\u6d4b\u8bd5\u65b9\u6cd5\u5199\u5165 \u6d4b\u8bd5\u89e6\u53d1\u5668\u548c\u7c7b\uff0c\u7136\u540e\u8fd0\u884c\u8fd9\u4e9b\u6d4b\u8bd5\u4ee5\u751f\u6210\u4ee3\u7801\u8986\u76d6\u7387 \u4fe1\u606f\u3002<\/p>\n\n\n\n<p>\u6d4b\u8bd5\u65b9\u6cd5\u6db5\u76d6\u7684\u9876\u70b9\u89e6\u53d1\u5668\u548c\u7c7b<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/developer.salesforce.com\/docs\/resources\/img\/en-us\/246.0?doc_id=dev_guides%2Fapex%2Fimages%2Fcode_coverage_by_test_classes.png&amp;folder=apexcode\" alt=\"\u6d4b\u8bd5\u65b9\u6cd5\u6db5\u76d6\u7684\u9876\u70b9\u89e6\u53d1\u5668\u548c\u7c7b\"\/><\/figure>\n\n\n\n<p>\u9664\u4e86\u786e\u4fdd\u4ee3\u7801\u7684\u8d28\u91cf\u5916\uff0c\u5355\u5143\u6d4b\u8bd5\u8fd8\u4f7f\u60a8\u80fd\u591f\u6ee1\u8db3\u4ee3\u7801\u8981\u6c42 \u90e8\u7f72\u6216\u6253\u5305 Apex \u7684\u8986\u76d6\u7387\u8981\u6c42\u3002\u8981\u90e8\u7f72 Apex \u6216\u5c06\u5176\u6253\u5305\u4e3a Salesforce AppExchange\uff0c\u5355\u5143\u6d4b\u8bd5\u5fc5\u987b\u81f3\u5c11\u8986\u76d6 75% \u7684 Apex \u4ee3\u7801\uff0c\u5e76\u4e14\u8fd9\u4e9b\u6d4b\u8bd5 \u5fc5\u987b\u901a\u8fc7\u3002<\/p>\n\n\n\n<p>\u4ee3\u7801\u8986\u76d6\u7387\u662f\u6d4b\u8bd5\u6709\u6548\u6027\u7684\u4e00\u4e2a\u6307\u6807\uff0c\u4f46\u4e0d\u80fd\u4fdd\u8bc1\u6d4b\u8bd5 \u6709\u6548\u6027\u3002\u6d4b\u8bd5\u7684\u8d28\u91cf\u4e5f\u5f88\u91cd\u8981\uff0c\u4f46\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee3\u7801\u8986\u76d6\u7387\u4f5c\u4e3a\u5de5\u5177\u6765 \u8bc4\u4f30\u662f\u5426\u9700\u8981\u6dfb\u52a0\u66f4\u591a\u6d4b\u8bd5\u3002\u867d\u7136\u60a8\u9700\u8981\u6ee1\u8db3\u6700\u4f4e\u4ee3\u7801\u8986\u76d6\u7387 \u90e8\u7f72\u6216\u6253\u5305 Apex \u4ee3\u7801\u7684\u8981\u6c42\uff0c\u4ee3\u7801\u8986\u76d6\u7387\u4e0d\u5e94\u662f\u552f\u4e00\u7684\u76ee\u6807 \u60a8\u7684\u6d4b\u8bd5\u3002\u6d4b\u8bd5\u5e94\u65ad\u8a00\u5e94\u7528\u7684\u884c\u4e3a\uff0c\u5e76\u786e\u4fdd\u4ee3\u7801\u7684\u8d28\u91cf\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4ee3\u7801\u8986\u76d6\u7387\u662f\u5982\u4f55\u8ba1\u7b97\u7684\uff1f<\/h2>\n\n\n\n<p><a><\/a>\u4ee3\u7801\u8986\u76d6\u7387\u767e\u5206\u6bd4\u662f\u8ba1\u7b97 \u8986\u76d6\u7ebf\u9664\u4ee5\u8986\u76d6\u7ebf\u6570\u548c\u672a\u8986\u76d6\u7ebf\u6570\u4e4b\u548c\u3002\u53ea \u5305\u62ec\u53ef\u6267\u884c\u4ee3\u7801\u884c\u3002\uff08\u6ce8\u91ca\u548c\u7a7a\u884c\u4e0d\u8ba1\u7b97\u5728\u5185\u3002 \u8bed\u53e5\u548c\u5927\u62ec\u53f7\u5728\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u88ab\u6392\u9664\u5728\u5916 \u5b83\u4eec\u5355\u72ec\u51fa\u73b0\u5728\u4e00\u884c\u4e0a\u3002\u4e00\u884c\u4e0a\u7684\u591a\u4e2a\u8bed\u53e5\u8ba1\u4e3a\u4e00\u884c \u4ee3\u7801\u8986\u76d6\u7387\u7684\u76ee\u7684\u3002\u5982\u679c\u8bed\u53e5\u7531\u591a\u4e2a\u8868\u8fbe\u5f0f\u7ec4\u6210\uff0c\u8fd9\u4e9b\u8868\u8fbe\u5f0f\u5199\u5728 \u591a\u884c\uff0c\u6bcf\u884c\u90fd\u8ba1\u5165\u4ee3\u7801\u8986\u76d6\u7387\u3002<samp>System.debug()<\/samp><\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u5177\u6709\u4e00\u4e2a\u65b9\u6cd5\u7684\u7c7b\u7684\u793a\u4f8b\u3002\u8fd9\u95e8\u8bfe\u7684\u6d4b\u8bd5\u662f run\uff0c\u5e76\u5728\u5f00\u53d1\u4eba\u5458\u63a7\u5236\u53f0\u4e2d\u4e3a\u6b64\u7c7b\u9009\u62e9\u4e86\u663e\u793a\u4ee3\u7801\u8986\u76d6\u7387\u7684\u9009\u9879\u3002 \u84dd\u7ebf\u8868\u793a\u6d4b\u8bd5\u8986\u76d6\u7684\u7ebf\u3002\u672a\u7a81\u51fa\u663e\u793a\u7684\u884c \u88ab\u6392\u9664\u5728\u4ee3\u7801\u8986\u76d6\u7387\u8ba1\u7b97\u4e4b\u5916\u3002\u7ea2\u7ebf\u8868\u793a\u672a\u8986\u76d6\u7684\u7ebf \u901a\u8fc7\u6d4b\u8bd5\u3002\u4e3a\u4e86\u5b9e\u73b0\u5168\u9762\u8986\u76d6\uff0c\u9700\u8981\u66f4\u591a\u7684\u6d4b\u8bd5\u3002\u6d4b\u8bd5\u5fc5\u987b\u4f7f\u7528\u4e0d\u540c\u7684\u8f93\u5165\u8fdb\u884c\u8c03\u7528\uff0c\u5e76\u9a8c\u8bc1\u8fd4\u56de\u7684 \u4ef7\u503c\u3002<samp>getTaskPriority()<\/samp><\/p>\n\n\n\n<p>\u8fd9\u662f\u6d4b\u8bd5\u65b9\u6cd5\u90e8\u5206\u6db5\u76d6\u7684\u7c7b\u3002\u5bf9\u5e94\u7684\u6d4b\u8bd5\u7c7b \u672a\u663e\u793a\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/developer.salesforce.com\/docs\/resources\/img\/en-us\/246.0?doc_id=dev_guides%2Fapex%2Fimages%2Fapex_testing_code_coverage_partial_dev_console.png&amp;folder=apexcode\" alt=\"\u5f00\u53d1\u8005\u63a7\u5236\u53f0\u4e2d\u5177\u6709\u4ee3\u7801\u8986\u76d6\u7387\u89c6\u56fe\u7684\u793a\u4f8b\u7c7b\"\/><\/figure>\n\n\n\n<p>\u6d4b\u8bd5\u7c7b\uff08\u5e26\u6709 \u6ce8\u91ca\u7684\u7c7b\uff09 \u4ece\u4ee3\u7801\u8986\u76d6\u7387\u8ba1\u7b97\u4e2d\u6392\u9664\u3002\u6b64\u6392\u9664\u9879\u9002\u7528\u4e8e\u6240\u6709\u6d4b\u8bd5\u7c7b \u65e0\u8bba\u5b83\u4eec\u5305\u542b\u4ec0\u4e48 &#8211; \u7528\u4e8e\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u65b9\u6cd5\u6216\u5b9e\u7528\u65b9\u6cd5\u3002<samp>@isTest<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>Apex \u7f16\u8bd1\u5668\u6709\u65f6\u4f1a\u4f18\u5316\u8bed\u53e5\u4e2d\u7684\u8868\u8fbe\u5f0f\u3002\u4f8b\u5982\uff0c\u5982\u679c\u591a\u4e2a \u5b57\u7b26\u4e32\u5e38\u91cf\u4e0e\u8fd0\u7b97\u7b26 \u7f16\u8bd1\u5668\u5728\u5185\u90e8\u5c06\u8fd9\u4e9b\u8868\u8fbe\u5f0f\u66ff\u6362\u4e3a\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5982\u679c\u5b57\u7b26\u4e32 \u4e32\u8054\u8868\u8fbe\u5f0f\u4f4d\u4e8e\u5355\u72ec\u7684\u884c\u4e0a\uff0c\u9644\u52a0\u884c\u4e0d\u8ba1\u4e3a \u4f18\u5316\u540e\u7684\u4ee3\u7801\u8986\u76d6\u7387\u8ba1\u7b97\u3002\u4e3a\u4e86\u8bf4\u660e\u8fd9\u4e00\u70b9\uff0c\u5b57\u7b26\u4e32\u53d8\u91cf\u662f \u5206\u914d\u7ed9\u4e24\u4e2a\u8fde\u63a5\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u7b2c\u4e8c\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u4f4d\u4e8e \u5206\u5f00 \u7ebf\u3002<samp>+<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>String s = 'Hello'\n    + ' World!';<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>String s = 'Hello World!';<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u68c0\u67e5\u4ee3\u7801\u8986\u76d6\u7387<\/h2>\n\n\n\n<p>\u8fd0\u884c\u6d4b\u8bd5\u540e\uff0c\u53ef\u4ee5\u5728\u201c\u5f00\u53d1\u4eba\u5458\u201d\u7684\u201c\u6d4b\u8bd5\u201d\u9009\u9879\u5361\u4e2d\u67e5\u770b\u4ee3\u7801\u8986\u76d6\u7387\u4fe1\u606f \u5b89\u6170\u3002\u4ee3\u7801\u8986\u76d6\u7387\u7a97\u683c\u5305\u62ec\u6bcf\u4e2a Apex \u7c7b\u7684\u8986\u76d6\u7387\u4fe1\u606f\uff0c\u4ee5\u53ca \u5168\u9762\u8986\u76d6\u7ec4\u7ec7\u4e2d\u7684\u6240\u6709 Apex \u4ee3\u7801\u3002<\/p>\n\n\n\n<p>\u6b64\u5916\uff0c\u4ee3\u7801\u8986\u76d6\u7387\u5b58\u50a8\u5728\u4e24\u4e2a Lightning Platform Tooling API \u5bf9\u8c61\u4e2d\uff1a ApexCodeCoverageAggregate \u548c ApexCodeCoverage\u3002ApexCodeCoverageAggregate \u5b58\u50a8 \u5728\u68c0\u67e5\u6d4b\u8bd5\u7c7b\u7684\u6240\u6709\u6d4b\u8bd5\u65b9\u6cd5\u540e\uff0c\u4e3a\u8be5\u7c7b\u8986\u76d6\u4e86\u884c\u3002ApexCodeCoverage \u5b58\u50a8 \u6bcf\u4e2a\u5355\u72ec\u7684\u6d4b\u8bd5\u65b9\u6cd5\u8986\u76d6\u548c\u672a\u8986\u76d6\u7684\u7ebf\u3002\u51fa\u4e8e\u8fd9\u4e2a\u539f\u56e0\uff0c\u4e00\u4e2a \u7c7b\u5728 ApexCodeCoverage \u4e2d\u53ef\u4ee5\u6709\u591a\u4e2a\u8986\u76d6\u7387\u7ed3\u679c\uff0c\u6bcf\u4e2a\u6d4b\u8bd5\u65b9\u6cd5\u4e00\u4e2a\u8986\u76d6\u7387\u7ed3\u679c \u8fd9\u5df2\u7ecf\u6d4b\u8bd5\u4e86\u5b83\u3002\u53ef\u4ee5\u4f7f\u7528 SOQL \u548c\u5de5\u5177 API \u67e5\u8be2\u8fd9\u4e9b\u5bf9\u8c61\u4ee5\u68c0\u7d22 \u8986\u76d6\u8303\u56f4\u4fe1\u606f\u3002\u5c06 SOQL \u67e5\u8be2\u4e0e\u5de5\u5177 API \u7ed3\u5408\u4f7f\u7528\u662f\u68c0\u67e5\u4ee3\u7801\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5 \u8986\u76d6\u8303\u56f4\u548c\u83b7\u53d6\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u7684\u5feb\u901f\u65b9\u6cd5\u3002<\/p>\n\n\n\n<p>\u4f8b\u5982\uff0c\u6b64 SOQL \u67e5\u8be2\u83b7\u53d6\u7c7b\u7684\u4ee3\u7801\u8986\u76d6\u7387\u3002\u8986\u76d6\u7387\u662f\u4ece\u6267\u884c \u6b64\u7c7b\u4e2d\u7684\u65b9\u6cd5\u3002<samp>TaskUtil<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT ApexClassOrTrigger.Name, NumLinesCovered, NumLinesUncovered \nFROM ApexCodeCoverageAggregate \nWHERE ApexClassOrTrigger.Name = 'TaskUtil'<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u6b64 SOQL \u67e5\u8be2\u9700\u8981\u5de5\u5177 API\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u67e5\u8be2\u7f16\u8f91\u5668\u8fd0\u884c\u6b64\u67e5\u8be2 \uff0c\u7136\u540e\u9009\u4e2d&nbsp;<strong>Use Tooling API<\/strong>\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u6d4b\u8bd5\u90e8\u5206\u8986\u76d6\u7684\u7c7b\u7684\u793a\u4f8b\u67e5\u8be2\u7ed3\u679c\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>ApexClassOrTrigger.Name<\/th><th>NumLines\u8986\u76d6<\/th><th>NumLines\u672a\u8986\u76d6<\/th><\/tr><\/thead><tbody><tr><td>\u4efb\u52a1\u5b9e\u7528\u6027<\/td><td>8<\/td><td>2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u4e0b\u4e00\u4e2a\u793a\u4f8b\u6f14\u793a\u5982\u4f55\u786e\u5b9a\u54ea\u4e9b\u6d4b\u8bd5\u65b9\u6cd5\u6db5\u76d6\u4e86\u8be5\u7c7b\u3002\u67e5\u8be2 \u4ece\u5b58\u50a8\u8986\u76d6\u8303\u56f4\u7684\u5176\u4ed6\u5bf9\u8c61 ApexCodeCoverage \u83b7\u53d6\u8986\u76d6\u7387\u4fe1\u606f \u6309\u6d4b\u8bd5\u7c7b\u548c\u65b9\u6cd5\u5217\u51fa\u7684\u4fe1\u606f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT ApexTestClass.Name,TestMethodName,NumLinesCovered,NumLinesUncovered \nFROM ApexCodeCoverage \nWHERE ApexClassOrTrigger.Name = 'TaskUtil'<\/code><\/pre>\n\n\n\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u793a\u4f8b\u67e5\u8be2\u7ed3\u679c\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>ApexTestClass.Name<\/th><th>TestMethodName \uff08\u6d4b\u8bd5\u65b9\u6cd5\u540d\u79f0\uff09<\/th><th>NumLines\u8986\u76d6<\/th><th>NumLines\u672a\u8986\u76d6<\/th><\/tr><\/thead><tbody><tr><td>TaskUtilTest<\/td><td>testTaskPriority\uff08\u6d4b\u8bd5\u4efb\u52a1\u4f18\u5148\u7ea7\uff09<\/td><td>7<\/td><td>3<\/td><\/tr><tr><td>TaskUtilTest<\/td><td>testTaskHighPriority\uff08\u6d4b\u8bd5\u4efb\u52a1\u9ad8\u4f18\u5148\u7ea7\uff09<\/td><td>6<\/td><td>4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>ApexCodeCoverage \u4e2d\u7684 NumLinesUncovered \u503c\u4e0e \u805a\u5408\u7ed3\u679c\u4e3a ApexCodeCoverageAggregate\uff0c\u56e0\u4e3a\u5b83\u4eec\u8868\u793a\u4e0e \u6d4b\u8bd5\u65b9\u6cd5\u5404\u3002\u4f8b\u5982\uff0c\u6d4b\u8bd5\u65b9\u6cd5\u8986\u76d6\u4e86\u6574\u4e2a\u73ed\u7ea7\u7684 7 \u884c\uff0c\u603b\u5171 10 \u884c \u884c\uff0c\u56e0\u6b64\u672a\u8986\u76d6\u7684\u884c\u6570\u4e3a 3 \u884c \uff0810\u20137\uff09\u3002\u56e0\u4e3a\u805a\u5408\u8986\u76d6\u7387\u5b58\u50a8\u5728 ApexCodeCoverageAggregate \u5305\u62ec\u6240\u6709\u6d4b\u8bd5\u65b9\u6cd5\u7684\u8986\u76d6\u7387\uff0c\u5176\u4e2d \u548c \u7684\u8986\u76d6\u7387\u88ab\u5305\u62ec\u5728\u5185\uff0c\u53ea\u5269\u4e0b 2 \u884c\u672a\u88ab\u8986\u76d6 \u4efb\u4f55\u6d4b\u8bd5\u65b9\u6cd5\u3002<samp>testTaskPriority()<\/samp><samp>testTaskPriority()<\/samp><samp>testTaskPriority()<\/samp><samp>testTaskHighPriority()<\/samp><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4ee3\u7801\u8986\u76d6\u7387\u6700\u4f73\u5b9e\u8df5<\/h1>\n\n\n\n<p>\u8bf7\u8003\u8651\u4ee5\u4e0b\u4ee3\u7801\u8986\u76d6\u7387\u63d0\u793a\u548c\u6700\u4f73\u505a\u6cd5\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4ee3\u7801\u8986\u76d6\u7387\u4e00\u822c\u63d0\u793a<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8fd0\u884c\u6d4b\u8bd5\u4ee5\u5237\u65b0\u4ee3\u7801\u8986\u76d6\u7387\u3002\u5728\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u4e0d\u4f1a\u5237\u65b0\u4ee3\u7801\u8986\u76d6\u7387\u6570\u5b57 \u9664\u975e\u91cd\u65b0\u8fd0\u884c\u6d4b\u8bd5\uff0c\u5426\u5219\u5c06\u5bf9\u7ec4\u7ec7\u4e2d\u7684 Apex \u4ee3\u7801\u8fdb\u884c\u66f4\u65b0\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u7ec4\u7ec7\u81ea\u4e0a\u6b21\u6d4b\u8bd5\u8fd0\u884c\u4ee5\u6765\u5df2\u66f4\u65b0\uff0c\u5219\u4ee3\u7801\u8986\u76d6\u7387\u4f30\u8ba1\u53ef\u4ee5 \u4e0d\u6b63\u786e\u3002\u91cd\u65b0\u8fd0\u884c Apex \u6d4b\u8bd5\u4ee5\u83b7\u5f97\u6b63\u786e\u7684\u4f30\u8ba1\u503c\u3002<\/li>\n\n\n\n<li>\u7ec4\u7ec7\u4e2d\u7684\u603b\u4f53\u4ee3\u7801\u8986\u76d6\u7387\u767e\u5206\u6bd4\u4e0d\u5305\u62ec \u6258\u7ba1\u5305\u6d4b\u8bd5\u3002\u552f\u4e00\u7684\u4f8b\u5916\u662f\u6258\u7ba1\u5305\u6d4b\u8bd5\u5bfc\u81f4\u89e6\u53d1\u5668 \u706b\u707e\u3002\u6709\u5173\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1\u6258\u7ba1\u5305\u6d4b\u8bd5\u3002<\/li>\n\n\n\n<li>\u8986\u76d6\u7387\u57fa\u4e8e\u7ec4\u7ec7\u4e2d\u7684\u4ee3\u7801\u884c\u603b\u6570\u3002\u6dfb\u52a0\u6216\u5220\u9664 \u4ee3\u7801\u884c\u66f4\u6539\u8986\u76d6\u7387\u767e\u5206\u6bd4\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u4e00\u4e2a\u7ec4\u7ec7\u6709 50 \u4e2a \u6d4b\u8bd5\u65b9\u6cd5\u6db5\u76d6\u7684\u4ee3\u7801\u884c\u3002\u5982\u679c\u6dfb\u52a0\u7684\u89e6\u53d1\u5668\u5305\u542b 50 \u884c\u4ee3\u7801\uff0c\u5219\u4e0d \u901a\u8fc7\u6d4b\u8bd5\uff0c\u4ee3\u7801\u8986\u76d6\u7387\u4ece 100% \u4e0b\u964d\u5230 50%\u3002\u89e6\u53d1\u5668\u589e\u52a0 \u7ec4\u7ec7\u4e2d\u7684\u603b\u4ee3\u7801\u884c\u4ece 50 \u884c\u5230 100 \u884c\uff0c\u5176\u4e2d\u53ea\u6709 50 \u884c\u7531 \u6d4b\u8bd5\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e3a\u4ec0\u4e48\u6c99\u76d2\u548c\u751f\u4ea7\u73af\u5883\u4e4b\u95f4\u7684\u4ee3\u7801\u8986\u76d6\u7387\u6570\u5b57\u4e0d\u540c<\/h2>\n\n\n\n<p>\u5f53 Apex \u90e8\u7f72\u5230\u751f\u4ea7\u73af\u5883\u6216\u4f5c\u4e3a\u8f6f\u4ef6\u5305\u7684\u4e00\u90e8\u5206\u4e0a\u4f20\u5230 Salesforce \u65f6 AppExchange\u3001Salesforce \u5728\u76ee\u6807\u7ec4\u7ec7\u4e2d\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u3002\u6c99\u76d2\u548c\u751f\u4ea7 \u73af\u5883\u901a\u5e38\u4e0d\u5305\u542b\u76f8\u540c\u7684\u6570\u636e\u548c\u5143\u6570\u636e\uff0c\u56e0\u6b64\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u4e0d\u4f1a \u59cb\u7ec8\u5339\u914d\u3002\u5982\u679c\u4ee3\u7801\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u7684\u8986\u76d6\u7387\u4f4e\u4e8e 75%\uff0c\u8bf7\u589e\u52a0\u8986\u76d6\u7387\u4ee5\u4fbf\u80fd\u591f \u4ee5\u90e8\u7f72\u6216\u4e0a\u4f20\u4ee3\u7801\u3002\u4ee5\u4e0b\u662f\u4ee3\u7801\u5dee\u5f02\u7684\u5e38\u89c1\u539f\u56e0 \u5f00\u53d1\u6216\u6c99\u76d2\u73af\u5883\u4e0e\u751f\u4ea7\u73af\u5883\u4e4b\u95f4\u7684\u8986\u76d6\u7387\u3002\u8fd9 \u4fe1\u606f\u53ef\u4ee5\u5e2e\u52a9\u60a8\u6392\u67e5\u548c\u534f\u8c03\u8fd9\u4e9b\u5dee\u5f02\u3002\u6d4b\u8bd5\u5931\u8d25\u5982\u679c\u4e00\u4e2a\u73af\u5883\u4e2d\u7684\u6d4b\u8bd5\u7ed3\u679c\u4e0d\u540c\uff0c\u5219\u603b\u4f53\u4ee3\u7801\u8986\u76d6\u7387\u767e\u5206\u6bd4 \u4e0d\u5339\u914d\u3002\u5728\u6bd4\u8f83\u6c99\u76d2\u548c\u751f\u4ea7\u73af\u5883\u4e4b\u95f4\u7684\u4ee3\u7801\u8986\u76d6\u7387\u4e4b\u524d\uff0c\u8bf7\u4f7f \u786e\u4fdd\u8981\u90e8\u7f72\u6216\u6253\u5305\u7684\u4ee3\u7801\u7684\u6240\u6709\u6d4b\u8bd5\u90fd\u5728\u7ec4\u7ec7\u4e2d\u901a\u8fc7 \u7b2c\u4e00\u3002\u53c2\u4e0e\u4ee3\u7801\u8986\u76d6\u7387\u8ba1\u7b97\u7684\u6d4b\u8bd5\u5fc5\u987b\u5168\u90e8\u901a\u8fc7 \u90e8\u7f72\u6216\u5305\u4e0a\u4f20\u3002\u6570\u636e\u4f9d\u8d56\u5173\u7cfb\u5982\u679c\u6d4b\u8bd5\u4f7f\u7528\u6279\u6ce8\u8bbf\u95ee\u7ec4\u7ec7\u6570\u636e\uff0c\u5219\u6d4b\u8bd5\u7ed3\u679c\u53ef\u4ee5 \u6839\u636e\u7ec4\u7ec7\u4e2d\u53ef\u7528\u7684\u6570\u636e\u800c\u6709\u6240\u4e0d\u540c\u3002\u5982\u679c \u6d4b\u8bd5\u4e2d\u5f15\u7528\u7684\u8bb0\u5f55\u4e0d\u5b58\u5728\u6216\u5df2\u66f4\u6539\uff0c\u6d4b\u8bd5\u5931\u8d25\u6216 \u5728 Apex \u65b9\u6cd5\u4e2d\u6267\u884c\u4e0d\u540c\u7684\u4ee3\u7801\u8def\u5f84\u3002\u4fee\u6539\u6d4b\u8bd5\uff0c\u4ee5\u4fbf \u4ed6\u4eec\u521b\u5efa\u6d4b\u8bd5\u6570\u636e\uff0c\u800c\u4e0d\u662f\u8bbf\u95ee\u7ec4\u7ec7\u6570\u636e\u3002<samp>@IsTest(SeeAllData=true)<\/samp>\u5143\u6570\u636e\u4f9d\u8d56\u5173\u7cfb\u5143\u6570\u636e\u4e2d\u7684\u66f4\u6539\uff08\u4f8b\u5982\u7528\u6237\u914d\u7f6e\u6587\u4ef6\u8bbe\u7f6e\u4e2d\u7684\u66f4\u6539\uff09\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6d4b\u8bd5 \u5931\u8d25\u6216\u6267\u884c\u4e0d\u540c\u7684\u4ee3\u7801\u8def\u5f84\u3002\u786e\u4fdd\u6c99\u76d2\u548c\u751f\u4ea7\u73af\u5883\u4e2d\u7684\u5143\u6570\u636e \u5339\u914d\uff0c\u6216\u786e\u4fdd\u5143\u6570\u636e\u66f4\u6539\u4e0d\u662f\u5bfc\u81f4\u4e0d\u540c\u6d4b\u8bd5\u6267\u884c\u7684\u539f\u56e0 \u884c\u4e3a\u3002<a><\/a>\u6258\u7ba1\u5305\u6d4b\u8bd5\u5728\u7528\u6237\u754c\u9762\u4e2d\u8fd0\u884c\u6240\u6709 Apex \u6d4b\u8bd5\u540e\u8ba1\u7b97\u7684\u4ee3\u7801\u8986\u76d6\u7387\uff0c\u4f8b\u5982 \u5f00\u53d1\u4eba\u5458\u63a7\u5236\u53f0\uff0c\u53ef\u80fd\u4e0e\u5728 \u90e8\u7f72\u3002\u5982\u679c\u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\uff0c\u5305\u62ec\u6258\u7ba1\u5305\u6d4b\u8bd5\uff0c\u8bf7\u5728 \u7528\u6237\u754c\u9762\uff0c\u7ec4\u7ec7\u4e2d\u7684\u6574\u4f53\u4ee3\u7801\u8986\u76d6\u7387\u6ca1\u6709 \u5305\u62ec\u6258\u7ba1\u5305\u4ee3\u7801\u7684\u8986\u76d6\u7387\u3002\u867d\u7136\u6258\u7ba1\u5305\u6d4b\u8bd5 \u8986\u76d6\u6258\u7ba1\u5305\u4e2d\u7684\u4ee3\u7801\u884c\uff0c\u6b64\u8986\u76d6\u7387\u4e0d\u662f \u7ec4\u7ec7\u7684\u4ee3\u7801\u8986\u76d6\u7387\u8ba1\u7b97\u4e3a\u603b\u884c\u6570\u548c\u8986\u76d6\u884c\u6570\u3002 \u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u8fd0\u884c\u6240\u6709 \u6d4b\u8bd5\u901a\u8fc7\u6d4b\u8bd5 \u7ea7\u522b\u5305\u62ec\u6258\u7ba1\u5305\u4ee3\u7801\u7684\u8986\u76d6\u7387\u3002\u5982\u679c\u60a8\u8fd0\u884c\u7684\u662f\u6258\u7ba1 \u901a\u8fc7\u6d4b\u8bd5\u7ea7\u522b\u5728\u90e8\u7f72\u4e2d\u6253\u5305\u6d4b\u8bd5\uff0c\u5efa\u8bae\u8fd0\u884c\u6b64 \u9996\u5148\u5728\u6c99\u76d2\u4e2d\u90e8\u7f72\u6216\u6267\u884c\u9a8c\u8bc1\u90e8\u7f72\u4ee5\u9a8c\u8bc1 \u4ee3\u7801\u8986\u76d6\u7387\u3002<samp>RunAllTestsInOrg<\/samp><samp>RunAllTestsInOrg<\/samp>\u90e8\u7f72\u5bfc\u81f4\u6574\u4f53\u8986\u76d6\u7387\u4f4e\u4e8e 75%\u5c06\u5177\u6709 100% \u8986\u76d6\u7387\u7684\u65b0\u7ec4\u4ef6\u90e8\u7f72\u5230\u751f\u4ea7\u73af\u5883\u65f6\uff0c\u90e8\u7f72\u5931\u8d25 \u5982\u679c\u65b0\u4ee3\u7801\u548c\u73b0\u6709\u4ee3\u7801\u4e4b\u95f4\u7684\u5e73\u5747\u8986\u76d6\u7387\u672a\u8fbe\u5230 75% \u7684\u9608\u503c\u3002\u5982\u679c \u5728\u76ee\u6807\u7ec4\u7ec7\u4e2d\u6d4b\u8bd5\u8fd0\u884c\u8fd4\u56de\u7684\u8986\u76d6\u7387\u7ed3\u679c\u5c0f\u4e8e 75%\uff0c\u4fee\u6539 \u73b0\u6709\u7684\u6d4b\u8bd5\u65b9\u6cd5\u6216\u7f16\u5199\u989d\u5916\u7684\u6d4b\u8bd5\u65b9\u6cd5\u4ee5\u63d0\u9ad8\u4ee3\u7801\u8986\u76d6\u7387 75%.\u5355\u72ec\u90e8\u7f72\u4fee\u6539\u540e\u7684\u6216\u65b0\u7684\u6d4b\u8bd5\u65b9\u6cd5\uff0c\u6216\u4f7f\u7528\u5177\u6709 100% \u7684\u65b0\u4ee3\u7801\u90e8\u7f72 \u8986\u76d6\u3002\u751f\u4ea7\u73af\u5883\u4e2d\u7684\u4ee3\u7801\u8986\u76d6\u7387\u964d\u81f3 75% \u4ee5\u4e0b\u6709\u65f6\uff0c\u751f\u4ea7\u4e2d\u7684\u6574\u4f53\u8986\u76d6\u7387\u4f1a\u4e0b\u964d\u523075%\u4ee5\u4e0b\uff0c\u5373\u4f7f\u81f3\u5c11\u662f \u5f53\u7ec4\u4ef6\u4ece\u6c99\u76d2\u90e8\u7f72\u65f6\uff0c\u4e3a 75%\u3002\u4f9d\u8d56\u4e8e \u7ec4\u7ec7\u7684\u6570\u636e\u548c\u5143\u6570\u636e\u53ef\u80fd\u4f1a\u5bfc\u81f4\u4ee3\u7801\u8986\u76d6\u7387\u4e0b\u964d\u3002\u5982\u679c\u6570\u636e\u548c\u5143\u6570\u636e \u5df2\u7ecf\u8fdb\u884c\u4e86\u5145\u5206\u7684\u66f4\u6539\u4ee5\u6539\u53d8\u76f8\u5173\u6d4b\u8bd5\u65b9\u6cd5\u7684\u7ed3\u679c\uff0c\u67d0\u4e9b\u65b9\u6cd5\u53ef\u80fd\u4f1a\u5931\u8d25 \u6216\u884c\u4e3a\u4e0d\u540c\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u67d0\u4e9b\u884c\u5c06\u4e0d\u518d\u88ab\u8986\u76d6\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e3a\u751f\u4ea7\u73af\u5883\u5339\u914d\u4ee3\u7801\u8986\u76d6\u7387\u6570\u5b57\u7684\u63a8\u8350\u8fc7\u7a0b<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528\u5b8c\u6574\u6c99\u76d2\u4f5c\u4e3a\u751f\u4ea7\u90e8\u7f72\u7684\u6682\u5b58\u6c99\u76d2\u73af\u5883\u3002\u4e00\u4e2a\u5b8c\u6574\u7684 \u6c99\u76d2\u6a21\u62df\u751f\u4ea7\u4e2d\u7684\u5143\u6570\u636e\u548c\u6570\u636e\uff0c\u5e76\u6709\u52a9\u4e8e\u51cf\u5c11\u4ee3\u7801\u5dee\u5f02 \u4e24\u4e2a\u73af\u5883\u4e4b\u95f4\u7684\u8986\u76d6\u6570\u3002<\/li>\n\n\n\n<li>\u82e5\u8981\u51cf\u5c11\u5bf9\u6c99\u76d2\u548c\u751f\u4ea7\u7ec4\u7ec7\u4e2d\u6570\u636e\u7684\u4f9d\u8d56\u6027\uff0c\u8bf7\u5728 \u60a8\u7684 Apex \u6d4b\u8bd5\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u7531\u4e8e\u4ee3\u7801\u8986\u76d6\u7387\u4e0d\u8db3\u800c\u5bfc\u81f4\u90e8\u7f72\u5230\u751f\u4ea7\u73af\u5883\u5931\u8d25\uff0c\u8bf7\u7f16\u5199\u66f4\u591a\u6d4b\u8bd5 \u5c06\u6574\u4f53\u4ee3\u7801\u8986\u76d6\u7387\u63d0\u9ad8\u5230\u5c3d\u53ef\u80fd\u9ad8\u7684\u8986\u76d6\u7387\u6216 100%\u3002\u91cd\u8bd5 \u90e8\u7f72\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u5728\u6c99\u76d2\u4e2d\u63d0\u9ad8\u4ee3\u7801\u8986\u76d6\u7387\u540e\u90e8\u7f72\u5230\u751f\u4ea7\u73af\u5883\u5931\u8d25\uff0c \u4ece\u751f\u4ea7\u7ec4\u7ec7\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u3002\u786e\u5b9a\u4f4e\u4e8e 75% \u7684\u7c7b \u8986\u76d6\u3002\u5728\u6c99\u76d2\u4e2d\u4e3a\u8fd9\u4e9b\u7c7b\u7f16\u5199\u5176\u4ed6\u6d4b\u8bd5\u4ee5\u63d0\u9ad8\u4ee3\u7801\u8986\u76d6\u7387\u3002<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528 Stub API \u6784\u5efa\u6a21\u62df\u6846\u67b6<\/h1>\n\n\n\n<p>Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u7528\u4e8e\u5b9e\u73b0\u6a21\u62df\u6846\u67b6\u7684\u5b58\u6839 API\u3002\u6a21\u62df\u6846\u67b6 \u6709\u5f88\u591a\u597d\u5904\u3002\u5b83\u53ef\u4ee5\u7b80\u5316\u548c\u6539\u8fdb\u6d4b\u8bd5\uff0c\u5e76\u5e2e\u52a9\u60a8\u66f4\u5feb\u3001\u66f4\u5feb\u901f\u5730\u521b\u5efa\u66f4\u591a \u53ef\u9760\u7684\u6d4b\u8bd5\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5355\u72ec\u6d4b\u8bd5\u7c7b\uff0c\u8fd9\u5bf9\u5355\u5143\u5f88\u91cd\u8981 \u6d4b\u8bd5\u3002\u4f7f\u7528\u5b58\u6839 API \u6784\u5efa\u6a21\u62df\u6846\u67b6\u4e5f\u662f\u6709\u76ca\u7684\uff0c\u56e0\u4e3a \u5b58\u6839\u5bf9\u8c61\u5728\u8fd0\u884c\u65f6\u751f\u6210\u3002\u7531\u4e8e\u8fd9\u4e9b\u5bf9\u8c61\u662f\u52a8\u6001\u751f\u6210\u7684\uff0c\u56e0\u6b64 \u4e0d\u5fc5\u6253\u5305\u548c\u90e8\u7f72\u6d4b\u8bd5\u7c7b\u3002\u60a8\u53ef\u4ee5\u6784\u5efa\u81ea\u5df1\u7684\u6a21\u62df\u6846\u67b6\uff0c\u6216\u8005 \u60a8\u53ef\u4ee5\u4f7f\u7528\u5176\u4ed6\u4eba\u6784\u5efa\u7684\u3002<\/p>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u5b9a\u4e49\u5b58\u6839\u5bf9\u8c61\u7684\u884c\u4e3a\uff0c\u8fd9\u4e9b\u5bf9\u8c61\u5728\u8fd0\u884c\u65f6\u521b\u5efa\u4e3a\u533f\u540d\u5bf9\u8c61 Apex \u7c7b\u7684\u5b50\u7c7b\u3002\u5b58\u6839 API \u7531\u63a5\u53e3\u548c\u65b9\u6cd5\u7ec4\u6210\u3002<samp>System.StubProvider<\/samp><samp>System.Test.createStub()<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u6b64\u529f\u80fd\u9002\u7528\u4e8e\u9ad8\u7ea7 Apex \u5f00\u53d1\u4eba\u5458\u3002\u4f7f\u7528\u5b83\u9700\u8981\u5f7b\u5e95 \u4e86\u89e3\u5355\u5143\u6d4b\u8bd5\u548c\u6a21\u62df\u6846\u67b6\u3002\u5982\u679c\u4f60\u8ba4\u4e3a\u5632\u7b11 \u6846\u67b6\u662f\u53d6\u7b11\u4f60\u7684\u4e1c\u897f\uff0c\u4f60\u53ef\u80fd\u60f3\u591a\u505a\u4e00\u70b9 \u5728\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e4b\u524d\u8fdb\u884c\u7814\u7a76\u3002<\/p>\n\n\n\n<p>\u8ba9\u6211\u4eec\u770b\u4e00\u4e2a\u793a\u4f8b\u6765\u8bf4\u660e\u5b58\u6839 API \u7684\u5de5\u4f5c\u539f\u7406\u3002\u6b64\u793a\u4f8b\u4e0d\u662f\u6545\u610f\u7684 \u6765\u6f14\u793a\u6a21\u62df\u6846\u67b6\u7684\u5e7f\u6cdb\u53ef\u80fd\u7528\u9014\u3002\u5b83 \u6709\u610f\u7b80\u5355\u4e13\u6ce8\u4e8e\u4f7f\u7528 Apex \u5b58\u6839 API \u7684\u673a\u5236\u3002<\/p>\n\n\n\n<p>\u5047\u8bbe\u6211\u4eec\u60f3\u5728\u4e0b\u9762\u7684\u7c7b\u4e2d\u6d4b\u8bd5\u683c\u5f0f\u5316\u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class DateFormatter {    \n    \/\/ Method to test    \n    public String getFormattedDate(DateHelper helper) {\n        return 'Today\\'s date is ' + helper.getTodaysDate();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u901a\u5e38\uff0c\u5f53\u6211\u4eec\u8c03\u7528\u6b64\u65b9\u6cd5\u65f6\uff0c\u6211\u4eec\u4f1a\u4f20\u5165\u4e00\u4e2a\u5e2e\u52a9\u7a0b\u5e8f\u7c7b\uff0c\u8be5\u7c7b\u5177\u6709\u4e00\u4e2a\u65b9\u6cd5 \u8fd4\u56de\u4eca\u5929\u7684\u65e5\u671f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class DateHelper {   \n    \/\/ Method to stub    \n    public String getTodaysDate() {\n        return Date.today().format();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u4e0b\u9762\u7684\u4ee3\u7801\u8c03\u7528\u8be5\u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DateFormatter df = new DateFormatter();\nDateHelper dh = new DateHelper();\nString dateStr = df.getFormattedDate(dh);<\/code><\/pre>\n\n\n\n<p>\u4e3a\u4e86\u8fdb\u884c\u6d4b\u8bd5\uff0c\u6211\u4eec\u5e0c\u671b\u9694\u79bb\u8be5\u65b9\u6cd5\u4ee5\u786e\u4fdd\u683c\u5f0f\u6709\u6548 \u9002\u5f53\u5730\u3002\u8be5\u65b9\u6cd5\u7684\u8fd4\u56de\u503c\u901a\u5e38\u56e0\u65e5\u671f\u800c\u5f02\u3002\u7136\u800c\uff0c\u5728\u8fd9\u4e2a \u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u8fd4\u56de\u4e00\u4e2a\u6052\u5b9a\u7684\u3001\u53ef\u9884\u6d4b\u7684\u503c\uff0c\u4ee5\u5c06\u6211\u4eec\u7684\u6d4b\u8bd5\u9694\u79bb\u5230 \u683c\u5f0f\u3002\u800c\u4e0d\u662f\u7f16\u5199\u7c7b\u7684\u201c\u5047\u201d\u7248\u672c\uff0c\u8be5\u65b9\u6cd5\u8fd4\u56de \u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u6211\u4eec\u521b\u5efa\u7c7b\u7684\u5b58\u6839\u7248\u672c\u3002\u521b\u5efa\u5b58\u6839\u5bf9\u8c61 \u5728\u8fd0\u884c\u65f6\u52a8\u6001\uff0c\u6211\u4eec\u53ef\u4ee5\u6307\u5b9a\u5176\u65b9\u6cd5\u7684\u201c\u5b58\u6839\u201d\u884c\u4e3a\u3002<samp>getFormattedDate()<\/samp><samp>getTodaysDate()<\/samp>\u8981\u4f7f\u7528 Apex \u7c7b\u7684\u5b58\u6839\u7248\u672c\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u901a\u8fc7\u5b9e\u73b0\u63a5\u53e3\u6765\u5b9a\u4e49\u5b58\u6839\u7c7b\u7684\u884c\u4e3a\u3002<samp>System.StubProvider<\/samp><\/li>\n\n\n\n<li>\u4f7f\u7528\u8be5\u65b9\u6cd5\u5b9e\u4f8b\u5316\u5b58\u6839\u5bf9\u8c61\u3002<samp>System.Test.createStub()<\/samp><\/li>\n\n\n\n<li>\u4ece\u6d4b\u8bd5\u7c7b\u4e2d\u8c03\u7528\u5b58\u6839\u5bf9\u8c61\u7684\u76f8\u5173\u65b9\u6cd5\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b9e\u73b0 StubProvider \u63a5\u53e3<\/h2>\n\n\n\n<p>\u4e0b\u9762\u662f\u63a5\u53e3\u7684\u5b9e\u73b0\u3002<samp>StubProvider<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\npublic class MockProvider implements System.StubProvider {\n    \n    public Object handleMethodCall(Object stubbedObject, String stubbedMethodName, \n        Type returnType, List&lt;Type&gt; listOfParamTypes, List&lt;String&gt; listOfParamNames, \n        List&lt;Object&gt; listOfArgs) {\n        \n        \/\/ The following debug statements show an example of logging \n        \/\/ the invocation of a mocked method.\n       \n        \/\/ You can use the method name and return type to determine which method was called.\n        System.debug('Name of stubbed method: ' + stubbedMethodName);\n        System.debug('Return type of stubbed method: ' + returnType.getName());\n        \n        \/\/ You can also use the parameter names and types to determine which method \n        \/\/ was called.\n        for (integer i =0; i &lt; listOfParamNames.size(); i++) {\n            System.debug('parameter name: ' + listOfParamNames.get(i));\n            System.debug('  parameter type: ' + listOfParamTypes.get(i).getName());\n        }\n        \n        \/\/ This shows the actual parameter values passed into the stubbed method at runtime.\n        System.debug('number of parameters passed into the mocked call: ' + \n            listOfArgs.size());\n        System.debug('parameter(s) sent into the mocked call: ' + listOfArgs);\n        \n        \/\/ This is a very simple mock provider that returns a hard-coded value \n        \/\/ based on the return type of the invoked.\n        if (returnType.getName() == 'String')\n            return '8\/8\/2016';\n        else \n            return null;\n    }\n}<\/code><\/pre>\n\n\n\n<p><samp>StubProvider<\/samp>\u662f\u4e00\u4e2a\u56de\u8c03\u63a5\u53e3\u3002\u5b83 \u6307\u5b9a\u9700\u8981\u5b9e\u73b0\u7684\u5355\u4e2a\u65b9\u6cd5\uff1a\u3002\u5f53\u8c03\u7528\u5b58\u6839\u65b9\u6cd5\u65f6\uff0c\u5c06\u8c03\u7528\u3002\u60a8\u53ef\u4ee5\u5b9a\u4e49 \u6b64\u65b9\u6cd5\u4e2d\u5b58\u6839\u7c7b\u7684\u884c\u4e3a\u3002\u8be5\u65b9\u6cd5\u5177\u6709\u4ee5\u4e0b\u7279\u70b9 \u53c2\u6570\u3002<samp>handleMethodCall()<\/samp><samp>handleMethodCall()<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>stubbedObject\uff1a\u5b58\u6839\u5bf9\u8c61<\/li>\n\n\n\n<li>stubbedMethodName\uff1a\u8c03\u7528\u65b9\u6cd5\u7684\u540d\u79f0<\/li>\n\n\n\n<li>returnType\uff1a\u88ab\u8c03\u7528\u65b9\u6cd5\u7684\u8fd4\u56de\u7c7b\u578b<\/li>\n\n\n\n<li>listOfParamTypes\uff1a\u53c2\u6570\u7c7b\u578b\u7684\u5217\u8868 invoked \u65b9\u6cd5<\/li>\n\n\n\n<li>listOfParamNames\uff1a\u53c2\u6570\u540d\u79f0\u7684\u5217\u8868 invoked \u65b9\u6cd5<\/li>\n\n\n\n<li>listOfArgs\uff1a\u4f20\u9012\u5230\u6b64\u53c2\u6570\u7684\u5b9e\u9645\u53c2\u6570\u503c \u65b9\u6cd5\u5728\u8fd0\u884c\u65f6<\/li>\n<\/ul>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e9b\u53c2\u6570\u6765\u786e\u5b9a\u8c03\u7528\u4e86\u7c7b\u7684\u54ea\u4e2a\u65b9\u6cd5\uff0c\u4ee5\u53ca \u7136\u540e\uff0c\u60a8\u53ef\u4ee5\u5b9a\u4e49\u6bcf\u4e2a\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u68c0\u67e5\u9000\u8d27 \u7528\u4e8e\u6807\u8bc6\u5b83\u5e76\u8fd4\u56de\u786c\u7f16\u7801\u503c\u7684\u65b9\u6cd5\u7684\u7c7b\u578b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b9e\u4f8b\u5316\u7c7b\u7684\u5b58\u6839\u7248\u672c<\/h2>\n\n\n\n<p>\u4e0b\u4e00\u6b65\u662f\u5b9e\u4f8b\u5316\u8be5\u7c7b\u7684\u5b58\u6839\u7248\u672c\u3002\u4ee5\u4e0b\u5b9e\u7528\u7a0b\u5e8f \u7c7b\u8fd4\u56de\u4e00\u4e2a\u53ef\u7528\u4f5c\u6a21\u62df\u7684\u5b58\u6839\u5bf9\u8c61\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class MockUtil {\n    private MockUtil(){}\n\n    public static MockProvider getInstance() {\n        return new MockProvider();\n    }\n    \n     public static Object createMock(Type typeToMock) {\n        \/\/ Invoke the stub API and pass it our mock provider to create a \n        \/\/ mock class of typeToMock.\n        return Test.createStub(typeToMock, MockUtil.getInstance());\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8be5\u7c7b\u5305\u542b\u65b9\u6cd5\uff0c \u8c03\u7528\u8be5\u65b9\u6cd5\u3002 \u8be5\u65b9\u6cd5\u91c7\u7528 Apex \u7c7b \u7c7b\u578b\u548c\u6211\u4eec\u4e4b\u524d\u521b\u5efa\u7684\u63a5\u53e3\u7684\u5b9e\u4f8b\u3002\u5b83\u8fd4\u56de\u4e00\u4e2a\u5b58\u6839\u5bf9\u8c61\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \u6d4b\u8bd5\u3002<samp>createMock()<\/samp><samp>Test.createStub()<\/samp><samp>createStub()<\/samp><samp>StubProvider<\/samp><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8c03\u7528 Stub \u65b9\u6cd5<\/h2>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u4ece\u6d4b\u8bd5\u4e2d\u8c03\u7528\u5b58\u6839\u7c7b\u7684\u76f8\u5173\u65b9\u6cd5 \u7c7b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest \npublic class DateFormatterTest {   \n    @isTest \n    public static void testGetFormattedDate() {\n        \/\/ Create a mock version of the DateHelper class.\n        DateHelper mockDH = (DateHelper)MockUtil.createMock(DateHelper.class);\n        DateFormatter df = new DateFormatter();\n        \n        \/\/ Use the mocked object in the test.\n        System.assertEquals('Today\\'s date is 8\/8\/2016', df.getFormattedDate(mockDH));\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5728\u8fd9\u4e2a\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u8c03\u7528 \u521b\u5efa\u7c7b\u7684\u5b58\u6839\u7248\u672c\u3002\u7136\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u5b58\u6839\u5bf9\u8c61\u4e0a\u8c03\u7528\u8be5\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u8fd4\u56de\u6211\u4eec\u7684 \u786c\u7f16\u7801\u65e5\u671f\u3002\u4f7f\u7528\u786c\u7f16\u7801\u65e5\u671f\u5141\u8bb8\u6211\u4eec\u5728 \u9694\u79bb\u3002<samp>createMock()<\/samp><samp>DateHelper<\/samp><samp>getTodaysDate()<\/samp><samp>getFormattedDate()<\/samp><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Apex \u5b58\u6839 API \u9650\u5236<\/h2>\n\n\n\n<p>\u4f7f\u7528 Apex \u5b58\u6839 API \u65f6\uff0c\u8bf7\u8bb0\u4f4f\u4ee5\u4e0b\u9650\u5236\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u88ab\u6a21\u62df\u7684\u5bf9\u8c61\u5fc5\u987b\u4e0e\u5bf9\u65b9\u6cd5\u7684\u8c03\u7528\u4f4d\u4e8e\u540c\u4e00\u547d\u540d\u7a7a\u95f4\u4e2d\u3002\u4f46\u662f\uff0c \u63a5\u53e3\u7684\u5b9e\u73b0\u53ef\u4ee5\u5728\u53e6\u4e00\u4e2a\u547d\u540d\u7a7a\u95f4\u4e2d\u3002<samp>Test.createStub()<\/samp><samp>StubProvider<\/samp><\/li>\n\n\n\n<li>\u60a8\u65e0\u6cd5\u6a21\u62df\u4ee5\u4e0b Apex \u5143\u7d20\u3002\n<ul class=\"wp-block-list\">\n<li>\u9759\u6001\u65b9\u6cd5\uff08\u5305\u62ec\u5c06\u6765\u7684\u65b9\u6cd5\uff09<\/li>\n\n\n\n<li>\u79c1\u6709\u65b9\u6cd5<\/li>\n\n\n\n<li>\u5c5e\u6027\uff08getter \u548c setter\uff09<\/li>\n\n\n\n<li>\u89e6\u53d1\u5668<\/li>\n\n\n\n<li>\u5185\u90e8\u7c7b<\/li>\n\n\n\n<li>\u7cfb\u7edf\u7c7b\u578b<\/li>\n\n\n\n<li>\u5b9e\u73b0\u63a5\u53e3\u7684\u7c7b<samp>Batchable<\/samp><\/li>\n\n\n\n<li>\u53ea\u6709\u79c1\u6709\u6784\u9020\u51fd\u6570\u7684\u7c7b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u8fed\u4ee3\u5668\u4e0d\u80fd\u7528\u4f5c\u8fd4\u56de\u7c7b\u578b\u6216\u53c2\u6570\u7c7b\u578b\u3002<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002<\/p>\n","protected":false},"author":1,"featured_media":3781,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[199],"tags":[230],"class_list":["post-3780","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apex-","tag--apex"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u6d4b\u8bd5 Apex - \u767d\u767d\u968f\u7b14<\/title>\n<meta name=\"description\" content=\"Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.ponybai.com\/?p=3780\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6d4b\u8bd5 Apex - \u767d\u767d\u968f\u7b14\" \/>\n<meta property=\"og:description\" content=\"Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.ponybai.com\/?p=3780\" \/>\n<meta property=\"og:site_name\" content=\"\u767d\u767d\u968f\u7b14\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-30T00:43:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-29T00:45:13+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2023\/11\/test.png\" \/>\n\t<meta property=\"og:image:width\" content=\"477\" \/>\n\t<meta property=\"og:image:height\" content=\"312\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"ponybai\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"ponybai\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\/\/www.ponybai.com\/?p=3780#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=3780\"},\"author\":{\"name\":\"ponybai\",\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"headline\":\"\u6d4b\u8bd5 Apex\",\"datePublished\":\"2023-12-30T00:43:50+00:00\",\"dateModified\":\"2023-11-29T00:45:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=3780\"},\"wordCount\":709,\"publisher\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"keywords\":[\"\u6d4b\u8bd5 Apex\"],\"articleSection\":[\"Apex \u5f00\u53d1\u4eba\u5458\u6307\u5357\"],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.ponybai.com\/?p=3780\",\"url\":\"http:\/\/www.ponybai.com\/?p=3780\",\"name\":\"\u6d4b\u8bd5 Apex - \u767d\u767d\u968f\u7b14\",\"isPartOf\":{\"@id\":\"http:\/\/www.ponybai.com\/#website\"},\"datePublished\":\"2023-12-30T00:43:50+00:00\",\"dateModified\":\"2023-11-29T00:45:13+00:00\",\"description\":\"Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002\",\"breadcrumb\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=3780#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.ponybai.com\/?p=3780\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.ponybai.com\/?p=3780#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"http:\/\/www.ponybai.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6d4b\u8bd5 Apex\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.ponybai.com\/#website\",\"url\":\"http:\/\/www.ponybai.com\/\",\"name\":\"\u767d\u767d\u968f\u7b14\",\"description\":\"Salesforce\u5b98\u65b9\u8bb2\u5e08\",\"publisher\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.ponybai.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\",\"name\":\"ponybai\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg\",\"contentUrl\":\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg\",\"width\":248,\"height\":248,\"caption\":\"ponybai\"},\"logo\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"http:\/\/121.37.188.161\"],\"url\":\"http:\/\/www.ponybai.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u6d4b\u8bd5 Apex - \u767d\u767d\u968f\u7b14","description":"Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.ponybai.com\/?p=3780","og_locale":"zh_CN","og_type":"article","og_title":"\u6d4b\u8bd5 Apex - \u767d\u767d\u968f\u7b14","og_description":"Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002","og_url":"http:\/\/www.ponybai.com\/?p=3780","og_site_name":"\u767d\u767d\u968f\u7b14","article_published_time":"2023-12-30T00:43:50+00:00","article_modified_time":"2023-11-29T00:45:13+00:00","og_image":[{"width":477,"height":312,"url":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2023\/11\/test.png","type":"image\/png"}],"author":"ponybai","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"ponybai","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"10 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/www.ponybai.com\/?p=3780#article","isPartOf":{"@id":"http:\/\/www.ponybai.com\/?p=3780"},"author":{"name":"ponybai","@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"headline":"\u6d4b\u8bd5 Apex","datePublished":"2023-12-30T00:43:50+00:00","dateModified":"2023-11-29T00:45:13+00:00","mainEntityOfPage":{"@id":"http:\/\/www.ponybai.com\/?p=3780"},"wordCount":709,"publisher":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"keywords":["\u6d4b\u8bd5 Apex"],"articleSection":["Apex \u5f00\u53d1\u4eba\u5458\u6307\u5357"],"inLanguage":"zh-Hans"},{"@type":"WebPage","@id":"http:\/\/www.ponybai.com\/?p=3780","url":"http:\/\/www.ponybai.com\/?p=3780","name":"\u6d4b\u8bd5 Apex - \u767d\u767d\u968f\u7b14","isPartOf":{"@id":"http:\/\/www.ponybai.com\/#website"},"datePublished":"2023-12-30T00:43:50+00:00","dateModified":"2023-11-29T00:45:13+00:00","description":"Apex \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u6846\u67b6\uff0c\u5141\u8bb8\u60a8\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff0c\u8fd0\u884c \u6d4b\u8bd5\uff0c\u68c0\u67e5\u6d4b\u8bd5\u7ed3\u679c\uff0c\u5e76\u6709\u4ee3\u7801\u8986\u76d6\u7387\u7ed3\u679c\u3002\u8ba9\u6211\u4eec\u6765\u8c08\u8c08\u5355\u5143\u6d4b\u8bd5\u3001\u6d4b\u8bd5\u7684\u6570\u636e\u53ef\u89c1\u6027\u4ee5\u53ca\u53ef\u7528\u7684\u5de5\u5177 \u5728 Lightning \u5e73\u53f0\u4e0a\u7528\u4e8e\u6d4b\u8bd5 Apex\u3002\u6211\u4eec\u8fd8\u5c06\u4ecb\u7ecd\u6d4b\u8bd5\u6700\u4f73\u5b9e\u8df5 \u4ee5\u53ca\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\u3002","breadcrumb":{"@id":"http:\/\/www.ponybai.com\/?p=3780#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.ponybai.com\/?p=3780"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.ponybai.com\/?p=3780#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"http:\/\/www.ponybai.com\/"},{"@type":"ListItem","position":2,"name":"\u6d4b\u8bd5 Apex"}]},{"@type":"WebSite","@id":"http:\/\/www.ponybai.com\/#website","url":"http:\/\/www.ponybai.com\/","name":"\u767d\u767d\u968f\u7b14","description":"Salesforce\u5b98\u65b9\u8bb2\u5e08","publisher":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.ponybai.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":["Person","Organization"],"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883","name":"ponybai","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/","url":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg","contentUrl":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg","width":248,"height":248,"caption":"ponybai"},"logo":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/"},"sameAs":["http:\/\/121.37.188.161"],"url":"http:\/\/www.ponybai.com\/?author=1"}]}},"_links":{"self":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/3780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3780"}],"version-history":[{"count":2,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/3780\/revisions"}],"predecessor-version":[{"id":3783,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/3780\/revisions\/3783"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/media\/3781"}],"wp:attachment":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3780"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}