Sunday, July 7, 2024

@parameters at 'suite' tag, 'test' tag level:

 

@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 &apos;username&apos; 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 &apos;username&apos; 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

git commands MCQ

 Here are some multiple-choice questions (MCQs) on Git commands relevant for Selenium: 1. Which Git command is used to clone a remote reposi...