Best Carina code snippet using com.qaprosoft.carina.core.foundation.listeners.CarinaListener.attachTestLabels
Source:CarinaListener.java
...300 if (!Configuration.getBoolean(Parameter.FORCIBLY_DISABLE_DRIVER_QUIT)) {301 quitDrivers(Phase.BEFORE_METHOD, Phase.METHOD);302 }303 }304 attachTestLabels(result);305 } catch (Exception e) {306 LOGGER.error("Exception in CarinaListener->onTestFinish!", e);307 }308 }309 @Override310 public void onAfterClass(ITestClass testClass){311 LOGGER.debug("CarinaListener->onAfterClass(ITestClass testClass)");312 quitDrivers(Phase.BEFORE_CLASS);313 }314 @Override315 public void onFinish(ITestContext context) {316 LOGGER.debug("CarinaListener->onFinish(ITestContext context)");317 super.onFinish(context);318 // [SZ] it's still needed to close driver from BeforeClass stage.319 // Otherwise it could be potentially used in other test classes 320// quitDrivers(Phase.BEFORE_CLASS); already exited in onAfterClass() method321 quitDrivers(Phase.BEFORE_TEST);322 LOGGER.debug("CarinaListener->onFinish(context): " + context.getName());323 }324 @Override325 public void onFinish(ISuite suite) {326 LOGGER.debug("CarinaListener->onFinish(ISuite suite)");327 try {328 String browser = getBrowser();329 // String suiteName = getSuiteName(context);330 String title = getTitle(suite.getXmlSuite());331 TestResultType testResult = EmailReportGenerator.getSuiteResult(EmailReportItemCollector.getTestResults());332 String status = testResult.getName();333 title = status + ": " + title;334 String env = "";335 if (!Configuration.isNull(Parameter.ENV)) {336 env = Configuration.get(Parameter.ENV);337 }338 if (!Configuration.get(Parameter.URL).isEmpty()) {339 env += " - <a href='" + Configuration.get(Parameter.URL) + "'>" + Configuration.get(Parameter.URL)340 + "</a>";341 }342 ReportContext.getTempDir().delete();343 // EmailReportItemCollector.getTestResults());344 LOGGER.debug("Generating email report...");345 // Generate emailable html report using regular method346 EmailReportGenerator report = new EmailReportGenerator(title, env, Configuration.get(Parameter.APP_VERSION),347 browser, DateUtils.now(), EmailReportItemCollector.getTestResults(),348 EmailReportItemCollector.getCreatedItems());349 String emailContent = report.getEmailBody();350 // Store emailable report under emailable-report.html351 ReportContext.generateHtmlReport(emailContent);352 printExecutionSummary(EmailReportItemCollector.getTestResults());353 LOGGER.debug("Finish email report generation.");354 } catch (Exception e) {355 LOGGER.error("Exception in CarinaListener->onFinish(ISuite suite)", e);356 }357 }358 /**359 * Disable automatic drivers cleanup after each TestMethod and switch to controlled by tests itself.360 * But anyway all drivers will be closed forcibly as only suite is finished or aborted 361 */362 public static void disableDriversCleanup() {363 LOGGER.info("Automatic drivers cleanup will be disabled!");364 automaticDriversCleanup = false;365 }366 protected String getBrowser() {367 return Configuration.getBrowser();368 }369 protected String getTitle(XmlSuite suite) {370 String browser = getBrowser();371 if (!browser.isEmpty()) {372 browser = " " + browser; // insert the space before373 }374 String env = !Configuration.isNull(Parameter.ENV) ? Configuration.get(Parameter.ENV)375 : Configuration.get(Parameter.URL);376 String title = "";377 String app_version = "";378 if (!Configuration.get(Parameter.APP_VERSION).isEmpty()) {379 // if nothing is specified then title will contain nothing380 app_version = Configuration.get(Parameter.APP_VERSION) + " - ";381 }382 String suiteName = getSuiteName(suite);383 String xmlFile = getSuiteFileName(suite);384 title = String.format(SUITE_TITLE, app_version, suiteName, String.format(XML_SUITE_NAME, xmlFile), env, browser);385 return title;386 }387 private String getSuiteFileName(XmlSuite suite) {388 // TODO: investigate why we need such method and suite file name at all389 String fileName = suite.getFileName();390 if (fileName == null) {391 fileName = "undefined";392 }393 LOGGER.debug("Full suite file name: " + fileName);394 if (fileName.contains("\\")) {395 fileName = fileName.replaceAll("\\\\", "/");396 }397 fileName = StringUtils.substringAfterLast(fileName, "/");398 LOGGER.debug("Short suite file name: " + fileName);399 return fileName;400 }401 protected String getSuiteName(XmlSuite suite) {402 String suiteName = "";403 if (suite != null && !"Default suite".equals(suite.getName())) {404 suiteName = Configuration.get(Parameter.SUITE_NAME).isEmpty() ? suite.getName()405 : Configuration.get(Parameter.SUITE_NAME);406 } else {407 suiteName = Configuration.get(Parameter.SUITE_NAME).isEmpty() ? R.EMAIL.get("title")408 : Configuration.get(Parameter.SUITE_NAME);409 }410 return suiteName;411 }412 private void printExecutionSummary(List<TestResultItem> tris) {413 Messager.INFORMATION.info("**************** Test execution summary ****************");414 int num = 1;415 for (TestResultItem tri : tris) {416 String failReason = tri.getFailReason();417 if (failReason == null) {418 failReason = "";419 }420 if (!tri.isConfig()) {421 String reportLinks = !StringUtils.isEmpty(tri.getLinkToScreenshots())422 ? "screenshots=" + tri.getLinkToScreenshots() + " | " : "";423 reportLinks += !StringUtils.isEmpty(tri.getLinkToLog()) ? "log=" + tri.getLinkToLog() : "";424 Messager.TEST_RESULT.info(String.valueOf(num++), tri.getTest(), tri.getResult().toString(),425 reportLinks);426 }427 }428 }429 @Deprecated430 protected void putS3Artifact(String key, String path) {431 AmazonS3Manager.getInstance().put(Configuration.get(Parameter.S3_BUCKET_NAME), key, path);432 }433 @Deprecated434 protected S3Object getS3Artifact(String bucket, String key) {435 return AmazonS3Manager.getInstance().get(Configuration.get(Parameter.S3_BUCKET_NAME), key);436 }437 @Deprecated438 protected S3Object getS3Artifact(String key) {439 return getS3Artifact(Configuration.get(Parameter.S3_BUCKET_NAME), key);440 }441 @Deprecated442 protected void putAzureArtifact(String remotePath, String localPath) {443 AzureManager.getInstance().put(Configuration.get(Parameter.AZURE_CONTAINER_NAME), remotePath, localPath);444 }445 @Deprecated446 protected void getAzureArtifact(String bucket, String remotePath, File localPath) {447 AzureManager.getInstance().download(bucket, remotePath, localPath);448 }449 private static void updateAppPath() {450 451 String mobileAppPath = Configuration.getMobileApp();452 Matcher matcher = S3_BUCKET_PATTERN.matcher(mobileAppPath);453 LOGGER.debug("Analyzing if mobile app is located on S3...");454 if (matcher.find()) {455 mobileAppPath = updateS3AppPath(mobileAppPath);456 }457 matcher = AZURE_CONTAINER_PATTERN.matcher(mobileAppPath);458 LOGGER.debug("Analyzing if mobile app is located on Azure...");459 if (matcher.find()) {460 mobileAppPath = updateAzureAppPath(mobileAppPath);461 }462 463 matcher = APPCENTER_PATTERN.matcher(mobileAppPath);464 LOGGER.debug("Analyzing if mobile_app is located on AppCenter...");465 if (matcher.find()) {466 mobileAppPath = updateAppCenterAppPath(mobileAppPath);467 }468 469 Configuration.setMobileApp(mobileAppPath);470 }471 /**472 * Method to update MOBILE_APP path in case if apk is located in Hockey App.473 */474 private static String updateAppCenterAppPath(String mobileAppPath) {475 Matcher matcher = APPCENTER_PATTERN.matcher(mobileAppPath);476 if (matcher.find()) {477 LOGGER.info("app artifact is located on AppCenter...");478 String appName = matcher.group(1);479 String platformName = matcher.group(2);480 String buildType = matcher.group(3);481 String version = matcher.group(4);482 //TODO: test if generated appcenter download url is valid483 mobileAppPath = AppCenterManager.getInstance().getDownloadUrl(appName, platformName, buildType,484 version);485 } else {486 LOGGER.error("Unable to parse '{}' path using AppCenter pattern", mobileAppPath);487 }488 return mobileAppPath;489 }490 /**491 * Method to update MOBILE_APP path in case if apk is located in s3 bucket.492 */493 private static String updateS3AppPath(String mobileAppPath) {494 // get app path to be sure that we need(do not need) to download app495 // from s3 bucket496 Matcher matcher = S3_BUCKET_PATTERN.matcher(mobileAppPath);497 if (matcher.find()) {498 LOGGER.info("app artifact is located on s3...");499 String bucketName = matcher.group(1);500 String key = matcher.group(2);501 Pattern pattern = Pattern.compile(key);502 // analyze if we have any pattern inside mobile_app to make extra503 // search in AWS504 int position = key.indexOf(".*");505 if (position > 0) {506 // /android/develop/dfgdfg.*/Mapmyrun.apk507 int slashPosition = key.substring(0, position).lastIndexOf("/");508 if (slashPosition > 0) {509 key = key.substring(0, slashPosition);510 S3ObjectSummary lastBuild = AmazonS3Manager.getInstance().getLatestBuildArtifact(bucketName, key,511 pattern);512 key = lastBuild.getKey();513 }514 } else {515 key = AmazonS3Manager.getInstance().get(bucketName, key).getKey();516 }517 LOGGER.info("next s3 app key will be used: " + key);518 // generate presign url explicitly to register link as run artifact519 long hours = 72L*1000*60*60; // generate presigned url for nearest 3 days520 mobileAppPath = AmazonS3Manager.getInstance().generatePreSignUrl(bucketName, key, hours).toString();521 } else {522 LOGGER.error("Unable to parse '{}' path using S3 pattern", mobileAppPath);523 }524 525 return mobileAppPath;526 }527 /**528 * Method to update MOBILE_APP path in case if apk is located in Azure storage.529 */530 private static String updateAzureAppPath(String mobileAppPath) {531 Matcher matcher = AZURE_CONTAINER_PATTERN.matcher(mobileAppPath);532 if (matcher.find()) {533 LOGGER.info("app artifact is located on Azure...");534 String accountName = matcher.group(1);535 String containerName = matcher.group(2) == null ? "$root" : matcher.group(2);536 String remoteFilePath = matcher.group(3);537 LOGGER.info(538 "Account: " + accountName + "\n" +539 "Container: " + containerName + "\n" +540 "RemotePath: " + remoteFilePath + "\n"541 );542 R.CONFIG.put(Parameter.AZURE_ACCOUNT_NAME.getKey(), accountName);543 BlobProperties blobProperties = AzureManager.getInstance().get(containerName, remoteFilePath);544 String azureLocalStorage = Configuration.get(Parameter.AZURE_LOCAL_STORAGE);545 String localFilePath = azureLocalStorage + File.separator + StringUtils.substringAfterLast(remoteFilePath, "/");546 File file = new File(localFilePath);547 try {548 // verify requested artifact by checking the checksum549 if (file.exists() && FileManager.getFileChecksum(FileManager.Checksum.MD5, file).equals(Base64.encodeBase64String(blobProperties.getContentMd5()))) {550 LOGGER.info("build artifact with the same checksum already downloaded: " + file.getAbsolutePath());551 } else {552 LOGGER.info(553 String.format("Following data was extracted: container: %s, remotePath: %s, local file: %s",554 containerName, remoteFilePath, file.getAbsolutePath())555 );556 AzureManager.getInstance().download(containerName, remoteFilePath, file);557 }558 } catch (Exception exception) {559 LOGGER.error("Azure app path update exception detected!", exception);560 }561 mobileAppPath = file.getAbsolutePath();562 // try to redefine app_version if it's value is latest or empty563 String appVersion = Configuration.get(Parameter.APP_VERSION);564 if (appVersion.equals("latest") || appVersion.isEmpty()) {565 Configuration.setBuild(file.getName());566 }567 } else {568 LOGGER.error("Unable to parse '{}' path using Azure pattern", mobileAppPath);569 }570 571 return mobileAppPath;572 }573 protected void skipExecution(String message) {574 CurrentTest.revertRegistration();575 throw new SkipException(message);576 }577 /*578 * Parse TestNG <suite ...> tag and return any attribute579 * @param ISuite suite580 * @param IString attribute581 * @return String attribute value or empty string582 *583 */584 private String getAttributeValue(ISuite suite, String attribute) {585 String res = "";586 587 if (suite.getXmlSuite() == null || suite.getXmlSuite().getFileName() == null) {588 // #1514 Unable to execute the test classes from maven command line589 return res;590 }591 592 File file = new File(suite.getXmlSuite().getFileName());593 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();594 documentBuilderFactory.setValidating(false);595 documentBuilderFactory.setNamespaceAware(true);596 try {597 documentBuilderFactory.setFeature("http://xml.org/sax/features/namespaces", false);598 documentBuilderFactory.setFeature("http://xml.org/sax/features/validation", false);599 documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);600 documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);601 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();602 Document document = documentBuilder.parse(file);603 for (int i = 0; i < document.getChildNodes().getLength(); i++) {604 NamedNodeMap nodeMapAttributes = document.getChildNodes().item(i).getAttributes();605 if (nodeMapAttributes == null) {606 continue;607 }608 // get "name" from suite element609 // <suite verbose="1" name="Carina Demo Tests - API Sample" thread-count="3" >610 Node nodeName = nodeMapAttributes.getNamedItem("name");611 if (nodeName == null) {612 continue;613 }614 if (suite.getName().equals(nodeName.getNodeValue())) {615 // valid suite node detected616 Node nodeAttribute = nodeMapAttributes.getNamedItem(attribute);617 if (nodeAttribute != null) {618 res = nodeAttribute.getNodeValue();619 break;620 }621 }622 }623 } catch (Exception e) {624 LOGGER.warn("Unable to get attribute '" + attribute +"' from suite: " + suite.getXmlSuite().getFileName(), e);625 }626 return res;627 }628 private void setThreadCount(ISuite suite) {629 //Reuse default thread-count value from suite TestNG file if it is not overridden in _config.properties630 /*631 * WARNING! We coudn't override default thread-count="5" and data-provider-thread-count="10"!632 * suite.getXmlSuite().toXml() add those default values anyway even if the absent in suite xml file declaraton.633 * To make possible to parse correctly we had to reuse external parser and private getAttributeValue634 */635 636 if (Configuration.getThreadCount()>= 1) {637 // use thread-count from config.properties638 suite.getXmlSuite().setThreadCount(Configuration.getThreadCount());639 LOGGER.debug("Updated thread-count=" + suite.getXmlSuite().getThreadCount());640 } else {641 String suiteThreadCount = getAttributeValue(suite, "thread-count");642 LOGGER.debug("thread-count from suite: " + suiteThreadCount);643 if (suiteThreadCount.isEmpty()) {644 LOGGER.info("Set thread-count=1");645 R.CONFIG.put(Parameter.THREAD_COUNT.getKey(), "1");646 suite.getXmlSuite().setThreadCount(1);647 } else {648 // reuse value from suite xml file649 LOGGER.debug("Synching thread-count with values from suite xml file...");650 R.CONFIG.put(Parameter.THREAD_COUNT.getKey(), suiteThreadCount);651 LOGGER.info("Use thread-count='" + suite.getXmlSuite().getThreadCount() + "' from suite file.");652 }653 }654 if (Configuration.getDataProviderThreadCount() >= 1) {655 // use thread-count from config.properties656 suite.getXmlSuite().setDataProviderThreadCount(Configuration.getDataProviderThreadCount());657 LOGGER.debug("Updated data-provider-thread-count=" + suite.getXmlSuite().getDataProviderThreadCount());658 } else {659 String suiteDataProviderThreadCount = getAttributeValue(suite, "data-provider-thread-count");660 LOGGER.debug("data-provider-thread-count from suite: " + suiteDataProviderThreadCount);661 if (suiteDataProviderThreadCount.isEmpty()) {662 LOGGER.info("Set data-provider-thread-count=1");663 R.CONFIG.put(Parameter.DATA_PROVIDER_THREAD_COUNT.getKey(), "1");664 suite.getXmlSuite().setDataProviderThreadCount(1);665 } else {666 // reuse value from suite xml file667 LOGGER.debug("Synching data-provider-thread-count with values from suite xml file...");668 R.CONFIG.put(Parameter.DATA_PROVIDER_THREAD_COUNT.getKey(), suiteDataProviderThreadCount);669 LOGGER.info("Use data-provider-thread-count='" + suite.getXmlSuite().getDataProviderThreadCount() + "' from suite file.");670 }671 }672 }673 private String getCarinaVersion() {674 String carinaVersion = "";675 try {676 Class<CarinaListener> theClass = CarinaListener.class;677 String classPath = theClass.getResource(theClass.getSimpleName() + ".class").toString();678 LOGGER.debug("Class: " + classPath);679 Pattern pattern = Pattern.compile(".*\\/(.*)\\/.*!");680 Matcher matcher = pattern.matcher(classPath);681 if (matcher.find()) {682 carinaVersion = matcher.group(1);683 }684 } catch (Exception e) {685 LOGGER.debug(e.getMessage(), e);686 }687 return carinaVersion;688 }689 private void attachTestLabels(ITestResult result) {690 // register testrail cases...691 Set<String> trCases = getTestRailCasesUuid(result);692 for (String trCase : trCases) {693 TestRail.setCaseId(trCase);694 }695 // register qtest cases...696 Set<String> qtestCases = getQTestCasesUuid(result);697 if (qtestCases.size() > 0) {698 Label.attachToTest(SpecialKeywords.QTEST_TESTCASE_UUID, Arrays.copyOf(qtestCases.toArray(), qtestCases.size(), String[].class));699 }700 }701 private void attachTestRunLabels(ISuite suite) {702 String trSuite = getTestRailSuiteId(suite);703 if (!trSuite.isEmpty()) {...
attachTestLabels
Using AI Code Generation
1CarinaListener cl = new CarinaListener();2cl.attachTestLabels("label1", "label2");3CarinaListener cl = new CarinaListener();4cl.attachTestLabels("label1", "label2");5CarinaListener cl = new CarinaListener();6cl.attachTestLabels("label1", "label2");7CarinaListener cl = new CarinaListener();8cl.attachTestLabels("label1", "label2");9CarinaListener cl = new CarinaListener();10cl.attachTestLabels("label1", "label2");11CarinaListener cl = new CarinaListener();12cl.attachTestLabels("label1", "label2");13CarinaListener cl = new CarinaListener();14cl.attachTestLabels("label1", "label2");15CarinaListener cl = new CarinaListener();16cl.attachTestLabels("label1", "label2");17CarinaListener cl = new CarinaListener();18cl.attachTestLabels("label1", "label2");19CarinaListener cl = new CarinaListener();20cl.attachTestLabels("label1", "label2");21CarinaListener cl = new CarinaListener();22cl.attachTestLabels("label1", "label2");
attachTestLabels
Using AI Code Generation
1import com.qaprosoft.carina.core.foundation.listeners.CarinaListener;2import com.qaprosoft.carina.core.foundation.utils.Configuration;3import com.qaprosoft.carina.core.foundation.utils.Configuration.Parameter;4import com.qaprosoft.carina.core.foundation.utils.R;5import java.io.IOException;6import java.util.List;7import java.util.Map;8import org.apache.log4j.Logger;9import org.testng.ITestContext;10import org.testng.ITestListener;11import org.testng.ITestResult;12public class CustomTestListener extends CarinaListener implements ITestListener {13 private static final Logger LOGGER = Logger.getLogger(CustomTestListener.class);14 public void onStart(ITestContext context) {15 LOGGER.debug("onStart");16 super.onStart(context);17 }18 public void onFinish(ITestContext context) {19 LOGGER.debug("onFinish");20 super.onFinish(context);21 }22 public void onTestStart(ITestResult result) {23 LOGGER.debug("onTestStart");24 super.onTestStart(result);25 }26 public void onTestSuccess(ITestResult result) {27 LOGGER.debug("onTestSuccess");28 super.onTestSuccess(result);29 }30 public void onTestFailure(ITestResult result) {31 LOGGER.debug("onTestFailure");32 super.onTestFailure(result);33 }34 public void onTestSkipped(ITestResult result) {35 LOGGER.debug("onTestSkipped");36 super.onTestSkipped(result);37 }38 public void onTestFailedButWithinSuccessPercentage(ITestResult result) {39 LOGGER.debug("onTestFailedButWithinSuccessPercentage");40 super.onTestFailedButWithinSuccessPercentage(result);41 }42 public void onTestFailedWithTimeout(ITestResult result) {43 LOGGER.debug("onTestFailedWithTimeout");44 super.onTestFailedWithTimeout(result);45 }46}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!