Page History
Info | ||
---|---|---|
| ||
There is a more up-to-date tutorial using Selenium providing additional capabilities. Please check it instead. |
Overview
In this tutorial, we will create a Java Test class with multiple Test Cases, implemented in Java.
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package com.xpand.java; import org.testng.Assert; import org.testng.annotations.Test; import org.testng.annotations.BeforeSuite; import org.testng.annotations.AfterSuite; import org.testng.annotations.DataProvider; import org.testng.Reporter; import org.testng.reporters.XMLReporter; import org.testng.ITestResult; import com.xpandit.xpandtestng.annotations.Xray; public class CalcTest { @BeforeSuite public void setUp() throws Exception { } @AfterSuite public void tearDown() throws Exception { } @DataProvider public Object[][] ValidDataProvider() { return new Object[][]{ { 1, 2, 3 }, { 2, 3, 4 }, // error or the data itself :) { -1, 1, 0 } }; } @Test(dataProvider = "ValidDataProvider") @Xray(requirement = "CALC-1234", test = "CALC-1") public void CanAddNumbersFromGivenData(final int a, final int b, final int c) { Assert.assertEquals(Calculator.Add(a, b), c); } @Test @Xray(requirement = "CALC-1234", test = "CALC-2", labels = "core addition") public void CanAddNumbers() { Assert.assertEquals(Calculator.Add(1, 1),2); Assert.assertEquals(Calculator.Add(-1, 1),0); } @Test @Xray(requirement = "CALC-1235", labels = "core") public void CanSubtract() { Assert.assertEquals(Calculator.Subtract(1, 1), 0); Assert.assertEquals(Calculator.Subtract(-1, -1), 0); Assert.assertEquals(Calculator.Subtract(100, 5), 95); } @Test @Xray(requirement = "CALC-1236") public void CanMultiplyX() { Assert.assertEquals(Calculator.Multiply(1, 1), 1); Assert.assertEquals(Calculator.Multiply(-1, -1), 1); Assert.assertEquals(Calculator.Multiply(100, 5), 500); } @Test @Xray(requirement = "CALC-1237") public void CanDivide() { Assert.assertEquals(Calculator.Divide(1, 1), 1); Assert.assertEquals(Calculator.Divide(-1, -1), 1); Assert.assertEquals(Calculator.Divide(100, 5), 20); } @Test public void CanDoStuff() { Assert.assertNotEquals(true, true); } } |
...
This requires some additional side code, that uses TestNG extension mechanisms, in order to process the custom "Xray" annotation shown above. This code is not part of Xray and is only provided for reference; feel free to adapt and customize it to your needs..
Info | ||
---|---|---|
| ||
Instead of adding the listener code shown ahead, you can include a specific maven plugin that implements extensions for TestNG related to Xray. |
We We'll define an interface that will be used by a custom TestNG listener (i.e. implementing ITestListener).
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package com.xpandit.xpandtestng.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * A Custom Annotation to inject additional information into a TestNG Test */ @Retention(RetentionPolicy.RUNTIME) public @interface Xray { String requirement() default ""; String test() default ""; String labels() default ""; } |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package com.xpandxpandit.testng.annotations; import java.lang.reflect.Method; import org.testng.IInvokedMethod; import org.testng.IInvokedMethodListener; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestNGMethod; import org.testng.ITestResult; import static java.lang.System.out; import static java.lang.System.err; /** * The listener interface for receiving Xray events. * The Listener can be automatically invoked when TestNG tests are run by using ServiceLoader mechanism. * You can also add this listener to a TestNG Test class by adding * <code>@Listeners({com.xpand.java.XrayAnnotationListener.class})</code> * before the test class * * @see Xray */ public class XrayListener implements IInvokedMethodListener, ITestListener { boolean testSuccess = true; /* (non-Javadoc) * @see org.testng.IInvokedMethodListener#beforeInvocation(org.testng.IInvokedMethod, org.testng.ITestResult) */ public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { if(method.isTestMethod() && annotationPresent(method, Xray.class) ) { testResult.setAttribute("requirement", method.getTestMethod().getConstructorOrMethod().getMethod().getAnnotation(Xray.class).requirement()); testResult.setAttribute("test", method.getTestMethod().getConstructorOrMethod().getMethod().getAnnotation(Xray.class).test()); testResult.setAttribute("labels", method.getTestMethod().getConstructorOrMethod().getMethod().getAnnotation(Xray.class).labels()); } } private boolean annotationPresent(IInvokedMethod method, Class clazz) { boolean retVal = method.getTestMethod().getConstructorOrMethod().getMethod().isAnnotationPresent(clazz) ? true : false; return retVal; } /* (non-Javadoc) * @see org.testng.IInvokedMethodListener#afterInvocation(org.testng.IInvokedMethod, org.testng.ITestResult) */ public void afterInvocation(IInvokedMethod method, ITestResult testResult) { if(method.isTestMethod()) { if( !testSuccess ) { testResult.setStatus(ITestResult.FAILURE); } } } public void onTestStart(ITestResult result) { // TODO Auto-generated method stub } public void onTestSuccess(ITestResult result) { // TODO Auto-generated method stub } public void onTestFailure(ITestResult result) { // TODO Auto-generated method stub } public void onTestSkipped(ITestResult result) { // TODO Auto-generated method stub } public void onTestFailedButWithinSuccessPercentage(ITestResult result) { // TODO Auto-generated method stub } public void onStart(ITestContext context) { } public void onFinish(ITestContext context) { // TODO Auto-generated method stub } } |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xpand.java</groupId> <artifactId>xpand-test</artifactId> <version>1.0-SNAPSHOT</version> <properties> <!--XRay Properties --> <!--IN PROFILE ~.m2/settings.xml--> <!--<xray.jiraURL></xray.jiraURL> <xray.resultsFormat>JUNIT</xray.resultsFormat> <xray.username>admin</xray.username> <xray.password>123qwe</xray.password>--> <xray.projectKey>CALC</xray.projectKey> <!-- <xray.testExecKey></xray.testExecKey> <xray.testPlanKey></xray.testPlanKey> <xray.testEnvironments></xray.testEnvironments> <xray.revision></xray.revision> --> <xray.surefire.location>${basedir}/target/surefire-reports</xray.surefire.location> <!--End Xray Properties --> </properties> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <debug>true</debug> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version> 2<version>2.20.1</version> <configuration> <testFailureIgnore>true</testFailureIgnore> <suiteXmlFiles> <suiteXmlFile>testng.xml</suiteXmlFile> </suiteXmlFiles> <properties> <property> <name>reporter</name> <value>org.testng.reporters.XMLReporter:generateTestResultAttributes=true,generateGroupsAttribute=true</value> </property> </properties> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6<version>7.4.11<0</version> <scope>test</scope> </dependency> <dependency> <groupId>com.xpandit.xray</groupId> <artifactId>xray-maven-plugin</artifactId> <version>1.0.0</version> <scope>test</scope> </dependency> </dependencies> <repositories> <repository> <id>xpandit</id> <name>xpand-releases</name> <url>http://maven.xpand-it.com/artifactory/releases</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <reporting> <plugins> <plugin> <artifactId>maven-surefire-report-plugin</artifactId> </plugin> <plugin> <groupId>com.xpandit.xray</groupId> <artifactId>xray-maven-plugin</artifactId> <version>1.01.0</version> </plugin> </plugins> </reporting> </project> |
...
- http://testng.org/doc/documentation-main.html
- https://github.com/bitcoder/xray-testng-extensions
- Taking advantage of TestNG XML reports
...