Running unit tests
Running unit and integration tests with ElasTest doesn't require launching beforehand a Sut. The test itself will manage the execution of the tested software. So the only requirment is to create a TJob into a Project and launch it.
Here we will run our JUnit5 Unit Test provided by default in ElasTest, which has a single class with two methods, sum and sub, that receive two numerical values to add or subtract respectively. This test has been developed in Java using JUnit5:
CalcTest class
public class CalcTest extends ElasTestBase {
private Calc calc;
static int left = 3;
static int right = 2;
@BeforeEach
public void setup() {
this.calc = new Calc();
}
@Test
public void sumTest() {
int expectedResult = 5;
logger.info("Checking if {} + {} = {}", left, right, expectedResult);
assertEquals(expectedResult, calc.sum(left, right));
}
@Test
public void subTest() {
int expectedResult = 1;
logger.info("Checking if {} + {} = {}", left, right, expectedResult);
assertEquals(expectedResult, calc.sub(left, right));
}
}
In addition, as can be seen in the example, this test class extends a class called ElasTestBase which is responsible for printing logs at the beginning and end of each test. These two logs have a specific structure and are used by ElasTest to filter the logs and metrics corresponding to each test
, as well as knowing its start and end date. We explain this in more detail here
ElasTestBase class
public class ElasTestBase {
protected static final Logger logger = LoggerFactory.getLogger(ElasTestBase.class);
@BeforeEach
public void logStart(TestInfo testInfo) {
logger.info("##### Start test: " + testInfo.getTestMethod().get().getName());
}
@AfterEach
public void logEnd(TestInfo testInfo) {
logger.info("##### Finish test: " + testInfo.getTestMethod().get().getName());
}
}
Running the "JUnit5 Unit Test" TJob
To Run "JUnit5 Unit Test" TJob you only need follow these steps:
1. Access your ElasTest dashboard
2. Get into "Unit Tests" project
3. Run the 'JUnit5 Unit Test' TJob
4. Execution screen is open automatically
Our TJob will start running: you will see the test information and log.
Once the test is finished you will see the test results and log. Eventually the test should end succesfully.
IMPORTANT: ElasTest make use of xml results file to get all the test results information.
You can click on the Test Suite to display it and see each of the Test Cases. You can also click on one of them to navigate to the information section of this Test Case, where you can see their logs filtered thanks to the two traces of logs that the class ElasTestBase prints at the beginning and end of each test and that we have commented above. We are going to click on subTest:
You can click too on the View In LogAnalyzer
button for navigate to Log Analyzer Tool and view the execution logs:
Or you can click on the View Case In LogAnalyzer
button view the specific test execution logs:
Creating a "JUnit5 Unit Test" TJob yourself
If you want to create the TJob yourself, you only need follow these steps:
1. Access your ElasTest dashboard
2. Create a New Project
The Projects serve to organize the TJobs related to each other. You can create a new Project by clicking on the button with the same name. You only need to indicate the name of the project and then click on SAVE button:
Immediately you will be redirected to the project page:
3. Create a new TJob
You can create a new TJob by clicking on the button with the same name:
When a TJob is created, the minimum information that you have to provide is the following:
- TJob Name: name of the TJob
- Select a SuT: If your TJob make use of a Software under Test. In this case, none.
- Environment docker image: the docker image that will host your test. This docker images should contain a client to download your code from your repository hosting service. For example, if your tests are hosted in GitHub and implemented in a Maven project with Java, you need to include a git client, Maven and the Java Development Kit (JDK) in the image.
- Commands: these are the bash commands to be executed to download the code from a repository and to execute the tests. The specific commands depends on the source code repository type and the technology.
In our case, we will need to insert the following data for the TJob "JUnit5 Unit Test":
- TJob Name: can be called as you want, but we will call it
JUnit5 Unit Test
- Test Results Path:
/demo-projects/unit/junit5-unit-test/target/surefire-reports
. This is the complete path where the xml reports of the execution in the container will be saved. We will explain it in more detail below. - Select a SuT:
None
- Environment docker image:
elastest/test-etm-alpinegitjava
(image that contains Git, Maven and Java). - Commands:
git clone https://github.com/elastest/demo-projects; cd /demo-projects/unit/junit5-unit-test; mvn -B test
By clicking on SAVE the TJob will be saved and you will be redirected to the project page again, where you will be able to execute the TJob.
4. Run the TJob from the Project's page
Click on the "Run TJob" button:
XML Report, Test Results Path and Start/End Test Traces
ElasTest makes use of xml reports generated by the tests to obtain the results.
The Test Results Path
is the complete path of the test container where the xml reports of the execution will be saved.
The appearance of an xml report, such as the one generated when running the TJob JUnit5 Unit Test, is the following:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" name="io.elastest.demo.unit.CalcTest" time="0.017" tests="2" errors="0" skipped="0" failures="0">
<testcase name="subTest" classname="io.elastest.demo.unit.CalcTest" time="0.006"/>
<testcase name="sumTest" classname="io.elastest.demo.unit.CalcTest" time="0"/>
</testsuite>
There is no official documentation on this xml format but you can find some examples on the internet, such as the following:
Thanks to this file, ElasTest knows information about each of the executed tests, such as the result, the duration or its name.
In order to know the start and end date of each test
and to be able to filter its logs and metrics, ElasTest looks for patterns in the logs that indicate the beginning and the end of the test. Both patterns must be printed on each test and have the following form:
-
Start test trace:
##### Start test: TESTNAME
-
Finish test trace:
##### Finish test: TESTNAME
Where TESTNAME
is the name of the test. The way of obtaining the name of the test depends on the technology in which the test is developed:
-
In the case of
JUnit5 Unit Test
that we have used as an example above, it is developed in Java with JUnit5. As can be seen in the ElasTestBase code, the name of the test is obtained by means of the testInfo parameter:testInfo.getTestMethod().get().getName()
-
We have included other example tests developed with other technologies. You can see it in the More Examples section
Since version 2.0.0
it is possible to add also the name of the test suite, since sometimes it is possible that several test suites have test cases with the same name and therefore ElasTest always took the same logs/metrics for all. The format it must have is the following:
-
Start test trace:
##### Start test: TESTSUITENAME -> TESTNAME
-
Finish test trace:
##### Finish test: TESTSUITENAME -> TESTNAME
More examples
The following examples, also offered by default in ElasTest, are implemented with different technologies:
CalcTest class
public class CalcTest extends ElasTestBase {
private Calc calc;
static int left = 3;
static int right = 2;
@Before
public void setup() {
this.calc = new Calc();
}
@Test
public void sumTest() {
int expectedResult = 5;
logger.info("Checking if {} + {} = {}", left, right, expectedResult);
assertEquals(expectedResult, calc.sum(left, right));
}
@Test
public void subTest() {
int expectedResult = 1;
logger.info("Checking if {} + {} = {}", left, right, expectedResult);
assertEquals(expectedResult, calc.sub(left, right));
}
}
ElasTestBase class
public class ElasTestBase {
protected static final Logger logger = LoggerFactory.getLogger(ElasTestBase.class);
@Rule
public TestName name = new TestName();
@Before
public void logStart() {
logger.info("##### Start test: " + name.getMethodName());
}
@After
public void logEnd() {
logger.info("##### Finish test: " + name.getMethodName());
}
}
TJob Configuration
- TJob Name: can be called as you want, but we will call it
JUnit4 Unit Test
- Test Results Path:
/demo-projects/unit/junit4-unit-test/target/surefire-reports
- Select a SuT:
None
- Environment docker image:
elastest/test-etm-alpinegitjava
- Commands:
git clone https://github.com/elastest/demo-projects; cd /demo-projects/unit/junit4-unit-test; mvn -B test
TestUnit class
import unittest
import os
import sys
import xmlrunner
import ElasTestBase
from Calc import \*
leftOperand = 3
rightOperand = 2
class TestUnit(ElasTestBase.ElasTestBase):
def test_sum(self):
global leftOperand
global rightOperand
expected = 5
print 'Checking if ' + str(leftOperand) + ' + ' + \
str(rightOperand) + ' = '+str(expected)
self.assertEqual(sum(leftOperand, rightOperand), expected)
def test_sub(self):
global leftOperand
global rightOperand
expected = 1
print 'Checking if ' + str(leftOperand) + ' - ' + \
str(rightOperand) + ' = '+str(expected)
self.assertEqual(sub(leftOperand, rightOperand), expected)
if **name** == '**main**':
file_path = './testresults'
if not os.path.exists(file_path):
os.makedirs(file_path)
file_name = file_path + '/results.xml'
with open(file_name, 'wb') as output:
unittest.main(
testRunner=xmlrunner.XMLTestRunner(output=output),
failfast=False, buffer=False, catchbreak=False)
ElasTestBase class
import unittest
class ElasTestBase(unittest.TestCase):
def setUp(self):
print '##### Start test: ' + self.\_testMethodName
def tearDown(self):
print '##### Finish test: ' + self._testMethodName
TJob Configuration
- TJob Name: can be called as you want, but we will call it
Python Unit Test
- Test Results Path:
/demo-projects/unit/python-unit-test/testresults
- Select a SuT:
None
- Environment docker image:
elastest/test-etm-alpinegitpython
(Alpine image with Git and Python)
- Commands:
git clone https://github.com/elastest/demo-projects; cd /demo-projects/unit/python-unit-test; python UnitTest.py;
unit-test-spec.js
require('./elastest-conf.js');
var calc = require('../calc.js');
leftOperand = 3;
rightOperand = 2;
describe('Unit Test', function() {
it('Sum', function() {
expectedResult = 5;
console.log('Checking if ' + leftOperand + ' + ' + rightOperand + ' = ' + expectedResult);
expect(calc.sum(leftOperand, rightOperand)).toEqual(expectedResult);
});
it('Sub', function() {
expectedResult = 1;
console.log('Checking if ' + leftOperand + ' - ' + rightOperand + ' = ' + expectedResult);
expect(calc.sub(leftOperand, rightOperand)).toEqual(expectedResult);
});
});
elastest-conf.js
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(
new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
savePath: 'testresults',
filePrefix: 'xml-report',
}),
);
var reporterCurrentSpec = {
specStarted: function(result) {
console.log('##### Start test: ' + result.description);
},
specDone: function(result) {
console.log('##### Finish test: ' + result.description);
},
};
jasmine.getEnv().addReporter(reporterCurrentSpec);
TJob Configuration
- TJob Name: can be called as you want, but we will call it
Jasmine Unit Test
- Test Results Path:
/demo-projects/unit/jasmine-unit-test/testresults
- Select a SuT:
None
- Environment docker image:
elastest/test-etm-alpinegitnode
(Alpine image with Git, Node, and necessary libraries like jasmine)
- Commands:
git clone https://github.com/elastest/demo-projects; cd /demo-projects/unit/jasmine-unit-test; jasmine;