Another idea:
@lfilipovi wants to create a new Keyword class com.lfilipovi.keyword.JUnitBuiltingKeyword
.
@lfilipovi want to copy the source of com.kms.katalon.core.testng.keyword.TestNGBuiltingKeywords
class into his new keyword class while changing the package and class name appropriately,
and @lfilipovi want to fix the problem in his new keyword class. I mean, change
if (runSuccess) {
→
if ( ! runSuccess) {
@lfilipovi wants to write Katalon Test cases like
import com.lfilipovic.keyword.JUnitBuiltinKeywords as JUnitKW
import com.lfilipovic.demo.SearchForEmployeeTest
JUnitKW.runJUnitTestClasses([SearchForEmployeeTest.class])
I tried this idea myself, and I encountered another problem.
I created a Keyword class com.lfilipovic.keyword.JUnitBuiltinKeywords
as follows:
package com.lfilipovic.keyword
import java.text.MessageFormat
import org.junit.runner.JUnitCore
import org.junit.runner.Result
import com.kms.katalon.core.annotation.Keyword
import com.kms.katalon.core.keyword.BuiltinKeywords
import com.kms.katalon.core.keyword.internal.KeywordMain
import com.kms.katalon.core.logging.KeywordLogger
import com.kms.katalon.core.model.FailureHandling
import com.kms.katalon.core.testng.keyword.JUnitRunnerResult
import com.kms.katalon.core.testng.keyword.TestNGBuiltinKeywords
import com.kms.katalon.core.testng.keyword.internal.JUnitRunnerResultImpl
public class JUnitBuiltinKeywords extends BuiltinKeywords {
private static final KeywordLogger logger = KeywordLogger.getInstance(TestNGBuiltinKeywords.class);
@Keyword
public static JUnitRunnerResult runJUnitTestClasses(List testClasses, FailureHandling flowControl) {
println "JUnitBuiltinKeywords#runJUnitTestClasses() was called"
return (JUnitRunnerResult) KeywordMain.runKeyword({
Result result = JUnitCore.runClasses(testClasses as Class[])
println "result.wasSuccessful()=" + result.wasSuccessful();
boolean runSuccess = result.wasSuccessful();
JUnitRunnerResultImpl junitRunnerResult = new JUnitRunnerResultImpl(runSuccess ? 'passed' : 'failed', result)
if ( ! runSuccess) {
KeywordMain.stepFailed(
MessageFormat.format("Running TestNG test classes: ''{0}'' failed", testClasses), flowControl)
} else {
logger.logPassed(MessageFormat.format("Running JUnit test classes: ''{0}'' passed", testClasses));
}
return junitRunnerResult
}, flowControl, "Keyword runJUnitTestClasses was failed");
}
}
I changed the JUnit4 Test case class as follows:
package com.lfilipovic.demo;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
@RunWith(JUnit4.class)
public class SearchForEmployeeTest {
private WebDriver driver;
private Map<String, Object> vars;
JavascriptExecutor js;
@Before
public void setUp() {
System.out.println("setUp() was called");
driver = new ChromeDriver();
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
}
@After
public void tearDown() {
System.out.println("tearDown() was called");
driver.quit();
}
@Test
public void searchForEmployee() {
System.out.println("searchForEmployee() was called");
driver.get("https://opensource-demo.orangehrmlive.com/web/index.php/auth/login");
driver.manage().window().setSize(new Dimension(1394, 1104));
driver.findElement(By.name("username")).click();
driver.findElement(By.name("username")).sendKeys("Admin");
driver.findElement(By.name("password")).click();
driver.findElement(By.name("password")).sendKeys("admin123");
driver.findElement(By.cssSelector(".oxd-button")).click();
driver.findElement(By.cssSelector(".oxd-main-menu-item-wrapper:nth-child(9) .oxd-text")).click();
{
WebElement element = driver.findElement(By.cssSelector(".active > .oxd-text"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
{
WebElement element = driver.findElement(By.tagName("body"));
Actions builder = new Actions(driver);
builder.moveToElement(element, 0, 0).perform();
}
driver.findElement(By.cssSelector(".oxd-select-text--focus > .oxd-select-text-input")).click();
{
WebElement element = driver.findElement(By.cssSelector(".orangehrm-horizontal-padding"));
Actions builder = new Actions(driver);
builder.moveToElement(element).release().perform();
}
driver.close();
}
}
I created a Test Case as test runner as follows:
import com.kms.katalon.core.model.FailureHandling
import com.lfilipovic.keyword.JUnitBuiltinKeywords as JUnitKW
import com.lfilipovic.demo.SearchForEmployeeTest
JUnitKW.runJUnitTestClasses([SearchForEmployeeTest.class], FailureHandling.STOP_ON_FAILURE)
When I executed the test runner, it failed. It emitted the following messages in the console:
2024-02-16 17:09:57.260 INFO c.k.katalon.core.main.TestCaseExecutor - --------------------
2024-02-16 17:09:57.265 INFO c.k.katalon.core.main.TestCaseExecutor - START Test Cases/TC3
JUnitBuiltinKeywords#runJUnitTestClasses() was called
setUp() was called
tearDown() was called
result.wasSuccessful()=false
2024-02-16 17:09:58.120 ERROR c.k.k.core.keyword.internal.KeywordMain - ❌ Running TestNG test classes: '[class com.lfilipovic.demo.SearchForEmployeeTest]' failed
2024-02-16 17:09:58.130 ERROR c.k.k.core.keyword.internal.KeywordMain - ❌ Keyword runJUnitTestClasses was failed (Root cause: com.kms.katalon.core.exception.StepFailedException: Running TestNG test classes: '[class com.lfilipovic.demo.SearchForEmployeeTest]' failed
at com.kms.katalon.core.keyword.internal.KeywordMain.stepFailed(KeywordMain.groovy:51)
at com.kms.katalon.core.keyword.internal.KeywordMain.stepFailed(KeywordMain.groovy)
at com.kms.katalon.core.keyword.internal.KeywordMain.stepFailed(KeywordMain.groovy:23)
at com.lfilipovic.keyword.JUnitBuiltinKeywords$_runJUnitTestClasses_closure1.doCall(JUnitBuiltinKeywords.groovy:32)
at com.lfilipovic.keyword.JUnitBuiltinKeywords$_runJUnitTestClasses_closure1.doCall(JUnitBuiltinKeywords.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at com.kms.katalon.core.keyword.internal.KeywordMain.runKeyword(KeywordMain.groovy:75)
at com.lfilipovic.keyword.JUnitBuiltinKeywords.runJUnitTestClasses(JUnitBuiltinKeywords.groovy:25)
at TC3.run(TC3:8)
at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:448)
at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:439)
at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:418)
at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:410)
at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:285)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:144)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:135)
at TempTestCase1708070989140.run(TempTestCase1708070989140.groovy:25)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
)
2024-02-16 17:09:58.137 ERROR c.k.katalon.core.main.TestCaseExecutor - ❌ Test Cases/TC3 FAILED.
Reason:
com.kms.katalon.core.exception.StepFailedException: Running TestNG test classes: '[class com.lfilipovic.demo.SearchForEmployeeTest]' failed
at com.kms.katalon.core.keyword.internal.KeywordMain.stepFailed(KeywordMain.groovy:51)
at com.kms.katalon.core.keyword.internal.KeywordMain.stepFailed(KeywordMain.groovy)
at com.kms.katalon.core.keyword.internal.KeywordMain.stepFailed(KeywordMain.groovy:23)
at com.lfilipovic.keyword.JUnitBuiltinKeywords$_runJUnitTestClasses_closure1.doCall(JUnitBuiltinKeywords.groovy:32)
at com.lfilipovic.keyword.JUnitBuiltinKeywords$_runJUnitTestClasses_closure1.doCall(JUnitBuiltinKeywords.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at com.kms.katalon.core.keyword.internal.KeywordMain.runKeyword(KeywordMain.groovy:75)
at com.lfilipovic.keyword.JUnitBuiltinKeywords.runJUnitTestClasses(JUnitBuiltinKeywords.groovy:25)
at TC3.run(TC3:8)
at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:448)
at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:439)
at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:418)
at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:410)
at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:285)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:144)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:135)
at TempTestCase1708070989140.run(TempTestCase1708070989140.groovy:25)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2024-02-16 17:09:58.155 INFO c.k.katalon.core.main.TestCaseExecutor - END Test Cases/TC3
The messages contain no information. It just says “I failed”. The messages do not tell me the reason why the JUnit4 test script failed.
The Keyword has a design shortage at :
if ( ! runSuccess) {
KeywordMain.stepFailed(MessageFormat.format("Running TestNG test classes: ''{0}'' failed", testClasses), flowControl)
} else {
The message text is poor because as designed. I copy & pasted this code fragment from the com.kms.katalon.core.testng.keyword.TestNGBuiltinKeywords
class.
The Katalon’s built-in keyword has the same design fault. I believe that Katalon developers have never used the TestNGBuiltinKeywords
class for their own sake.