Newer Version Available
ApexTestQueueItem
Supported SOAP API Calls
create(), describeSObjects(), query(), retrieve(), update(), upsert()
Supported REST API HTTP Methods
Query, GET, POST, PATCH
Fields
| Field Name | Details |
|---|---|
| ApexClassId |
|
| Status |
|
| ExtendedStatus |
|
| ParentJobId |
|
| TestRunResultID |
|
Usage
Insert an ApexTestQueueItem object to place its corresponding Apex class in the Apex job queue for execution. The Apex job executes the test methods in the class.
- You have already set up a Java client application for Streaming API. This example uses the org.cometd.client.BayeuxClient created in the Java Client code example in the Streaming API Developer Guide.
- You have a logged in com.sforce.soap.tooling.SoapConnection. For examples, see the SOAP API Developer Guide.
1import java.util.HashMap;
2import org.apache.commons.lang3.StringUtils;
3import org.cometd.bayeux.Message;
4import org.cometd.bayeux.client.ClientSessionChannel;
5import org.cometd.bayeux.client.ClientSessionChannel.MessageListener;
6import org.cometd.client.BayeuxClient;
7
8import com.sforce.soap.tooling.ApexTestQueueItem;
9import com.sforce.soap.tooling.ApexTestResult;
10import com.sforce.soap.tooling.QueryResult;
11import com.sforce.soap.tooling.SObject;
12import com.sforce.soap.tooling.SoapConnection;
13import com.sforce.soap.tooling.TestLevel;
14import com.sforce.ws.ConnectionException;
15
16public class RunTestListener {
17 private static final String CHANNEL = "/systemTopic/TestResult";
18 private SoapConnection conn;
19
20 public RunTestListener(BayeuxClient client, SoapConnection conn) {
21 this.conn = conn;
22 System.out.println("Subscribing for channel: " + CHANNEL);
23 client.getChannel(CHANNEL).subscribe(new MessageListener() {
24 @Override
25 public void onMessage(ClientSessionChannel channel, Message message) {
26 HashMap data = (HashMap) message.getData();
27 HashMap sobject = (HashMap) data.get("sobject");
28 String id = (String) sobject.get("Id");
29 System.out.println("\nAysncApexJob " + id);
30 getTestQueueItems(id);
31 }
32 });
33 }
34
35 public void runTests(String[] apexTestClassIds, String[] apexTestSuiteIds,
36 Integer maxFailedTests, String[] apexTestClassNames, String[] apexTestSuiteNames) {
37
38 // All parameters are required
39
40 if (apexTestClassIds == null && apexTestSuiteIds == null
41 && apexTestClassNames == null && apexTestSuiteNames == null) {
42 System.out.println("No tests to run");
43 return;
44 }
45 String classIds = StringUtils.join(apexTestClassIds,", ");
46 String suiteIds = StringUtils.join(apexTestSuiteIds,", ");
47 String classNames = StringUtils.join(apexTestClassNames,", ");
48 String suiteNames = StringUtils.join(apexTestSuiteNames,", ");
49
50 String tests = null;
51
52 try {
53 System.out.println("Running async test run");
54 conn.runTestsAsynchronous(classIds, suiteIds, maxFailedTests,
55 TestLevel.RunSpecifiedTests, classNames, suiteNames, tests);
56 } catch (ConnectionException e) {
57 e.printStackTrace();
58 }
59 }
60 public void createAndRunTestsNode(String apexTestClassName,
61 String apexTestClassId, String[] apexTestMethods) {
62
63 //Currently, the array size of TestNode objects must be 1
64
65 //Provide a non-null class name or a non-null class ID
66 if (apexTestClassName != null && apexTestClassId != null) {
67 System.out.println("Specify a class name OR a class ID");
68 return;
69 } else if (apexTestClassName == null && apexTestClassId == null) {
70 System.out.println("No tests to run");
71 return;
72 }
73
74 TestsNode thisTestsNode = new TestsNode();
75 thisTestsNode.setClassName(apexTestClassName);
76 thisTestsNode.setClassId(apexTestClassId);
77 thisTestsNode.setTestMethods(apexTestMethods);
78 TestsNode[] tests = new TestsNode[] { thisTestsNode };
79
80 try {
81 System.out.println("Running async test run");
82 conn.runTestsAsynchronous(null, null, -1, null, null, null, tests);
83 } catch (ConnectionException e) {
84 e.printStackTrace();
85 }
86 }
87
88 private void getTestQueueItems(String asyncApexJobId) {
89 try {
90 QueryResult res = conn
91 .query("SELECT Id, Status, ApexClassId FROM ApexTestQueueItem
92 WHERE ParentJobId = '" + asyncApexJobId + "'");
93 if (res.getSize() > 0) {
94 for (SObject o : res.getRecords()) {
95 ApexTestQueueItem atqi = (ApexTestQueueItem) o;
96 System.out.println("\tApexTestQueueItem - "+atqi.getStatus());
97 if (atqi.getStatus().equals("Completed")) {
98 getApexTestResults(atqi.getId());
99 }
100 }
101 } else {
102 System.out.println("No queued items for " + asyncApexJobId);
103 }
104 } catch (ConnectionException e) {
105 e.printStackTrace();
106 }
107 }
108
109 private void getApexTestResults(String apexTestQueueItemId) {
110 try {
111 QueryResult res = conn
112 .query("SELECT StackTrace,Message, AsyncApexJobId,MethodName, Outcome,ApexClassId
113 FROM ApexTestResult WHERE QueueItemId = '" + apexTestQueueItemId + "'");
114 if (res.getSize() > 0) {
115 for (SObject o : res.getRecords()) {
116 ApexTestResult atr = (ApexTestResult) o;
117 System.out.println("\tTest result for "
118 + atr.getApexClassId() + "." + atr.getMethodName());
119 String msg = atr.getOutcome().equals("Fail") ? " - "
120 + atr.getMessage() + " " + atr.getStackTrace() : "";
121 System.out.println("\t\tTest " + atr.getOutcome() + msg);
122 }
123 } else {
124 System.out.println("No Test Results for " + apexTestQueueItemId);
125 }
126 } catch (ConnectionException e) {
127 e.printStackTrace();
128 }
129 }
130}