@parameters at
'suite' tag, 'test' tag level:
Define parameter
at 'suite' tag level in testng.xml file:
We can define the test data in notepad file , Properties file,
Excel file ,. etc
in testng xml file also..
-------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<suite name = "My suite ">
<!-- define
parameter name = username ram-->
<parameter
name="username" value="ram"> </parameter>
<!-- // define
parameter name = password="mercury -->
<parameter
name="password"
value="mercury"> </parameter>
<test name=
"My test">
<classes>
<class
name="TestNGBasics2.TestNGReadingParameters"> </class>
</classes>
</test>
</suite>
Use parameters
from @test method :
package TestNGBasics2;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class TestNGReadingParameters
{
// TestNGBasics2.TestNGReadingParameters
// define some
test method and read parameters from
testng.xml file
// define
Parameters annotation - pass parameters- username,password
@Parameters({"username","password"})
// "Ram" "mercury"
@Test
void login(String
user,String pwd)
//
// while logging into any appl, we need user,
pwd
{ // define username and pwd test data some where
in config.properties, notepad.txt ,
///Excel
file
// define test data in testng.xml file
System.out.println("in
login test Method");
// dispaly username
System.out.println("user="+
user);
//
display password
System.out.println("pwd="
+ pwd);
}
}
Note :
Dont run from class, when
we want to get parameters -- always run as testng from testng.xml file but not from classs:
------------------
o/p:
[RemoteTestNG] detected TestNG version 7.0.0
[Utils] [ERROR] [Error] org.testng.TestNGException:
Parameter 'username' is required by @Test on
method login but has not been marked @Optional or defined
in
C:\Users\Lenovo\AppData\Local\Temp\testng-eclipse-822654040\testng-customsuite.xml
at
org.testng.internal.Parameters.createParams(Parameters.java:289)
at
org.testng.internal.Parameters.createParametersForMethod(Parameters.java:377)
at
org.testng.internal.Parameters.createParameters(Parameters.java:721)
at
org.testng.internal.Parameters.handleParameters(Parameters.java:895)
at
org.testng.internal.Parameters.handleParameters(Parameters.java:762)
at
org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at
org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at
org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:771)
at
org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at
java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at
org.testng.TestRunner.privateRun(TestRunner.java:770)
at
org.testng.TestRunner.run(TestRunner.java:591)
at
org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at
org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at
org.testng.SuiteRunner.run(SuiteRunner.java:304)
at
org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at
org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at
org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at
org.testng.TestNG.runSuites(TestNG.java:1032)
at
org.testng.TestNG.run(TestNG.java:1000)
at
org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at
org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at
org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
FAILED: login
org.testng.TestNGException:
Parameter 'username' is required by @Test on method login but has
not been marked @Optional or defined
in
C:\Users\Lenovo\AppData\Local\Temp\testng-eclipse-822654040\testng-customsuite.xml
at
org.testng.internal.Parameters.createParams(Parameters.java:289)
at
org.testng.internal.Parameters.createParametersForMethod(Parameters.java:377)
at
org.testng.internal.Parameters.createParameters(Parameters.java:721)
at
org.testng.internal.Parameters.handleParameters(Parameters.java:895)
at
org.testng.internal.Parameters.handleParameters(Parameters.java:762)
at
org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at
org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:771)
at
org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at
java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at
org.testng.TestRunner.privateRun(TestRunner.java:770)
at
org.testng.TestRunner.run(TestRunner.java:591)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at
org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at
org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at
org.testng.SuiteRunner.run(SuiteRunner.java:304)
at
org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at
org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at
org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at
org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at
org.testng.TestNG.runSuites(TestNG.java:1032)
at
org.testng.TestNG.run(TestNG.java:1000)
at
org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at
org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at
org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
===============================================
Default test
Tests run: 1, Failures:
1, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
===============================================
Note:
1. if parameters are there in class, always run from testng.xml file but not from
class
Go testng.xml file where we define parmeters > run as tetsng suite
o/p:
[RemoteTestNG] detected TestNG version 7.0.0
in login test Method
myuser=Ramu
mypassword=mercury
===============================================
Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================
HW Define parameters <!-- Define
browser = chrome --> and read
parameters data from class?
browser = chrome
QA1Env =
"https://opensource-demo.orangehrmlive.com/web/index.php/auth/login"
Note:
Parameter 'username' is required by @Test on
method login but has not been marked @Optional or defined
in
C:\brahma\Practise\SelniumPractiseNew\Jul2023WorkSpace\SeleniumProjectSep72023\TestNGWithParameters.xml
Parameter name in class
must be as same as testng.xml file
<parameter name ="username"
value="ram">
</parameter>
// @Parameters({"userName","password"})//
Fail as username and userName both are different
// always we
should give give same parameter name in class
as same as in testng.xml
username- userName- parameters are different
---------------------------------------------------
Note: 2 test tags should not have same name
<test
thread-count="5" name="Test">
<classes>
<class
name="TestNGReportsBasics.LoginParamters"/>
</classes>
</test> <!-- Test
-->
<test
thread-count="5" name="Test">
<classes>
<class
name="TestNGReportsBasics.LoginParamters"/>
</classes>
</test> <!-- Test
-->
Error:[RemoteTestNG] detected TestNG version 7.0.0
org.testng.TestNGException:
Two tests in the same suite [Suite] cannot have the same name:
Test
Sol: <test tags should have Difference name
but not same name ?
2 test tags
should not have same name
We have to give Difference name
for Test tags
<test
thread-count="5" name="Test-1">
<test
thread-count="5" name="Test-2">
@Parameters
at "Test" tag level:
<?xml version="1.0" encoding="UTF-8"?>
<suite name = "My suite ">
<!-- define parameter name = username -->
<parameter
name="username" value="ramu"> </parameter>
<!-- // define
parameter name = password -->
<parameter
name="password" value="mercury"> </parameter>
<test
thread-count="5" name="Test">
<!--
define parameter name="browser", chrome at 'Test ' level -->
<parameter
name="browser" value="chrome"> </parameter>
<classes>
<class
name="TestNGBasics2.TesNGReadParamtersAtTestTagLevel" />
</classes>
</test>
<!-- Test -->
</suite>
Access test level
Parameter in Class:
package TestNGBasics2;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class TesNGReadParamtersAtTestTagLevel {
// Read parameters from
testng.xml file
// read browser
parameter
// Define Parameters
-Browser
@Parameters("browser")
// chrome
@Test
void login(String
myBrowser)
{ // chrome , myBrowser = chrome
System.out.println("Browser
name-="+myBrowser);
// chrome
}
}
Run from testng.xml file :
o/p:
[RemoteTestNG] detected TestNG version 7.0.0
[TestNGContentHandler] [WARN] It is strongly recommended to add
"<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"
>" at the top of your file, otherwise TestNG may fail or not work as
expected.
in login test Method
MyBrowser=Chrome
===============================================
Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================
Note:
No of parameters in @Parameters
and no of arguments in @Test
Method must be equal.
else it throws below error
Error : Method login1 requires 2 parameters but 3 were supplied in
the @Test annotation.
ex:
package TestNGBasics2;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class TestNGReadingParameters
{
// define some
test method and read paramters from
testng.xml file
//
define Parameters annontation
-username","password","browser
// Error :
browser param is defined test tag level . so we can access in
TesNGReadParamtersAtTestTagLevel class only
// but not from TestNGReadingParameters
// //
define Parameters annontation -username","password"
@Parameters({"user","password"})
// "Ramu" "mercury"
@Test
// pass 2 args
// [Utils]
[ERROR] [Error] org.testng.TestNGException:
// Method
login1 requires 1 parameters but 2 were supplied in the @Test annotation.
void
login1(String myuser) // while logging into any appl, we need user,
pwd
{ // define username and pwd test data some where
in config.properties, notepad.txt ,
///Excel
file
// define test data in testng.xml file
System.out.println("in
login1 test Method");
//display
user,pwd
}
}
Difference between Suite ,
Test level Parameter in TestNg.xml file :
----------------------------------------------
Note:
Suite level parameter is like global var i.e we can access any
Test tags inside suite.
Test level parameter is like local var i.e we can access we
declared in test tag.
ex: suite level parameter
can be accessed from any where.
No comments:
Post a Comment