如何使用带有TestNG的DataDriven测试从不同的Env获取从excel到@BeforeTest的URL

时间:2016-11-06 08:59:14

标签: java selenium selenium-webdriver factory-pattern testng-dataprovider

在这种情况下,我只想使用dataprovider或任何其他可能的方式逐个迭代所有环境。请参阅我附带的excel文件

excel file

一个环境的代码:下面给出的LTI。注意:只需更改类名,即可为所有其他环境重复相同的代码。

public class LTI_ENV {

    public WebDriver driver;
    private String sTestCaseName;
    private int iTestCaseRow;

    @BeforeTest
    public void beforeMethod() throws Exception {

        DOMConfigurator.configure("log4j.xml");
        // Getting the Test Case name, as it will going to use in so many places
        // The main use is to get the TestCase row from the Test Data Excel sheet
        sTestCaseName = this.toString();
        // From above method we get long test case name including package and class name etc.
        // The below method will refine your test case name, exactly the name use have used

        //Here I want to parameterize URL for each test ,is there any method that I can do ???
        //My application have 3 module i.e for LTI –Env
        //1)Account Management (need to check pass?fail)
        //2)Prep and rating (need to check pass?fail)
        //3)Risk Eval (need to check pass?fail)
        sTestCaseName = Utils.getTestCaseName(this.toString());
        Log.startTestCase(sTestCaseName);
        ExcelUtils.setExcelFile(Constant.Path_TestData + Constant.File_TestData,"Sheet1");
        iTestCaseRow = ExcelUtils.getRowContains(sTestCaseName,Constant.Col_TestCaseName);
        driver = Utils.OpenBrowser(iTestCaseRow);
        new BaseClass(driver);  
    }

    @Test(priority=1)
    public void AccountManagement() throws Exception {  
        try {
            AccountCreation_Action.Execute(iTestCaseRow);
            AM_SubmissionLOB_Action.Execute(iTestCaseRow);
            AM_Classification_Action.Execute(iTestCaseRow);     
            //Verification_Action1.Execute();
            if (BaseClass.bResult==true) {
                ExcelUtils.setCellData("Pass", iTestCaseRow, Constant.Col_ResultStatus);
            } else {
                throw new Exception("Test Case Failed because of Verification");
            }
        } catch (Exception e) {
            ExcelUtils.setCellData("Fail", iTestCaseRow, Constant.Col_ResultStatus);
            Utils.takeScreenshot(driver, sTestCaseName);
            // This will print the error log message
            Log.error(e.getMessage());
            // Again throwing the exception to fail the test completely in the TestNG results
            throw (e);
        }   
    }

    @Test(priority=2,dependsOnMethods="AccountManagement")
    public void PrepandRating() throws Exception {

        try {
            GenInfopage_Action.Execute(iTestCaseRow);
            LocationSchedulePage_Actions.Execute(iTestCaseRow);
            PolicyCoveragePage_Action.Execute(iTestCaseRow);
            LocationInfo_Page_Action.Execute(iTestCaseRow);
            LocationSchedulePage_Actions.Execute(iTestCaseRow);
            AutoVehicleCoveragePage_Action.Execute(iTestCaseRow);
            AutoPolicyCoveragePage_Action.Execute(iTestCaseRow);
            PremiumSummaryPage_Action.Execute(iTestCaseRow);
            //Verification_Action2.Execute();

            if (BaseClass.bResult==true) {
                ExcelUtils.setCellData("Pass", iTestCaseRow+2, Constant.Col_ResultStatus);
            } else {
                throw new Exception("Test Case Failed because of Verification");
            }
        } catch (Exception e) {
            ExcelUtils[enter image description here][1].setCellData("Fail", iTestCaseRow+2, Constant.Col_ResultStatus);
            Utils.takeScreenshot(driver, sTestCaseName);
            Log.error(e.getMessage());
            throw (e);
        }
    }

    @Test(priority=3,dependsOnMethods="PrepandRating")
    public void RiskEval() throws Exception {
        //will update code for this module
    }

    // Its time to close the finish the test case       
    @AfterTest
    public void afterTest() {
        // Printing beautiful logs to end the test case
        Log.endTestCase(sTestCaseName);
        // Closing the  driver
        driver.quit(); //I need to close all the browser and then will launch again for other environment tests
    }
}

我面临的挑战是:

  1. 在上面的代码中,我首先使用TestCaseName在excel Utils.getTestCaseName(this.toString());列中搜索测试用例名称 因此,我一次只能运行一个环境。

  2. 如果我的测试运行状态为RUN /其他已跳过

  3. ,我想运行测试用例

    如何使用testNG编写此方案?与@BeforeTest一样,我需要为每个测试环境获取URL。

    请在下面找到我已实施的框架:http://toolsqa.wpengine.com/selenium-webdriver/selenium-automation-hybrid-framework

1 个答案:

答案 0 :(得分:0)

package TestNG.DataDriven;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.testng.Assert;
import org.testng.TestNG;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class XMLRun {

    public static XSSFWorkbook book;
    public static XSSFSheet sheet1;
    public static int LastRow=1;

    @Test(dataProvider="XMLFeed")
    public static void XMLRead(String Status,String XMLPath) throws Exception{

        if (Status.equalsIgnoreCase("Run")){
            // Create object of TestNG Class
            TestNG runner=new TestNG(); 
            // Create a list of String 
            List<String> suitefiles=new ArrayList<String>();

            // Add xml file which you have to execute
            suitefiles.add(XMLPath); 
            // now set xml file for execution
            runner.setTestSuites(suitefiles); 
            // finally execute the runner using run method
            runner.run();
        } else {
            Assert.fail("Skipped Test");
            //sheet1.getRow(LastRow).createCell(4).setCellValue("Not Executed");
            //com.ReadExcel.WriteExcel.WriteExcelSheet(LastRow, "NotExecuted", 4);
            com.ReadExcel.Excelreadwrite.excelwrite("Not Executed", LastRow);
        }
        LastRow++;
    }

    @DataProvider(name="XMLFeed")
    public Object[][] getData()
    {
        Object[][] obj=new Object[5][];

        File file=new File("TestData.xlsx");

        try {
            InputStream is=new FileInputStream(file);

            book=new XSSFWorkbook(is);

            sheet1=book.getSheet("Sheet1");

            for (int i=0;i<sheet1.getLastRowNum()+1;i++)
            {
                obj[i]=new Object[2];
                obj[i][0]=sheet1.getRow(i+1).getCell(1).
                getStringCellValue();
                obj[i][1]=sheet1.getRow(i+1).getCell(8).
                getStringCellValue();
                /*String result=login(username,password);
                sheet1.getRow(i).createCell(2).setCellValue(result);*/
            }
            book.close();
            is.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return obj;
    }
}
我用这种方式。它工作正常,但我希望所有这些都应该出现在一个套件中......并且所有testNG报告都应该在一个报告中生成。

以下是我的测试用例类:

Image