Skip to content

Instantly share code, notes, and snippets.

@Sunil02kumar
Last active September 23, 2022 10:02
Show Gist options
  • Save Sunil02kumar/4d855dd715181cab30f929d6ab9522cb to your computer and use it in GitHub Desktop.
Save Sunil02kumar/4d855dd715181cab30f929d6ab9522cb to your computer and use it in GitHub Desktop.
Way to export Code Coverage of Individual ApexClass or Trigger in .csv format
public class apexCodeCoverageWrapper {
public Integer size {get;set;}
public Integer totalSize {get;set;}
public Boolean done {get;set;}
public String entityTypeName {get;set;}
public List<Records> records {get;set;}
}
public class Records {
public String ApexTestClassId {get;set;}
public String ApexClassOrTriggerId {get;set;}
public Integer NumLinesCovered {get;set;}
public Integer NumLinesUncovered {get;set;}
}
HttpRequest req = new HttpRequest();
req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionID());
req.setHeader('Content-Type', 'application/json');
String domainUrl=URL.getSalesforceBaseUrl().toExternalForm();
system.debug('********domainUrl:'+domainUrl);
req.setEndpoint(domainUrl+'/services/data/v43.0/tooling/query/?q=SELECT+ApexClassorTriggerId,+ApexTestClassId,+NumLinesCovered,NumLinesUncovered+FROM+ApexCodeCoverage');
req.settimeout(12000);
req.setMethod('GET');
Http h = new Http();
HttpResponse res = h.send(req);
string resBody = res.getBody();
system.debug(res.getBody());
apexCodeCoverageWrapper JSONDetails=(apexCodeCoverageWrapper) System.JSON.deserialize(resBody, apexCodeCoverageWrapper.class);
system.debug('*********JSONDetails.records size='+JSONDetails.records.size());
system.debug('*********JSONDetails.records size='+JSONDetails.records[0]);
Map<Id,String> apexClassIdNameMap = new Map<Id,String>();
Map<Id,String> apexTriggerIdNameMap = new Map<Id,String>();
for(ApexClass ap:[select id,name from apexclass]){
apexClassIdNameMap.put(ap.id,ap.name);
}
for(ApexTrigger at:[select id,Name from ApexTrigger]){
apexTriggerIdNameMap.put(at.id,at.Name);
}
string header = 'Name , Id, ClassOrTrigger,ApexTestClassId,ApexTestClassName,NumLinesCovered, NumLinesUncovered,Code Coverage \n';
string finalstr = header ;
for(Records rec: JSONDetails.records){
string recordString='';
decimal covPerc;
decimal totalLines = rec.NumLinesCovered+rec.NumLinesUncovered;
if(totalLines >0){
covPerc = ((rec.NumLinesCovered)/(totalLines))*100;
}else{
covPerc = 0;
}
if(apexClassIdNameMap.get(rec.ApexClassOrTriggerId)!=null){
recordString = apexClassIdNameMap.get(rec.ApexClassOrTriggerId)+','+rec.ApexClassOrTriggerId+',ApexClass,'+rec.ApexTestClassId+','+apexClassIdNameMap.get(rec.ApexTestClassId)+','+rec.NumLinesCovered+','+rec.NumLinesUncovered+','+covPerc+'\n';
}else if(apexTriggerIdNameMap.get(rec.ApexClassOrTriggerId)!=null){
recordString = apexTriggerIdNameMap.get(rec.ApexClassOrTriggerId)+','+rec.ApexClassOrTriggerId+',ApexTrigger,'+rec.ApexTestClassId+','+apexClassIdNameMap.get(rec.ApexTestClassId)+','+rec.NumLinesUncovered+','+covPerc+'\n';
}
finalstr = finalstr +recordString;
}
Messaging.EmailFileAttachment csvAttc = new Messaging.EmailFileAttachment();
blob csvBlob = Blob.valueOf(finalstr);
string csvname= 'ApexCodeCoverage report.csv';
csvAttc.setFileName(csvname);
csvAttc.setBody(csvBlob);
Messaging.SingleEmailMessage email =new Messaging.SingleEmailMessage();
String[] toAddresses = new list<string> {UserInfo.getUserEmail()};
String subject ='Apex Code Coverage Report';
email.setSubject(subject);
email.setToAddresses( toAddresses );
email.setPlainTextBody(subject);
email.setFileAttachments(new Messaging.EmailFileAttachment[]{csvAttc});
Messaging.SendEmailResult [] r = Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment