当前位置: 首页 > 面试题库 >

Jenkins将参数传递给testNG Java

羊舌子瑜
2023-03-14
问题内容

我正在使用testNG,Selenium和Jenkins建立测试自动化框架。该代码工作正常,它读取一个或多个csv文件并将其用作测试数据。我从詹金斯进行测试。

package test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;

public class runTest {
private WebDriver myDriver = null;

    @BeforeTest
    public void openBrowser(){
        System.out.println("This test automation framework is created by --- for ---");
        //Set browser
        //System.setProperty("webdriver.chrome.driver", "C://Temp//chromedriver.exe");
        //System.setProperty("webdriver.ie.driver", "C://Temp//IEDriverServer.exe");

        //Instantiate new WebDriver object with browser of choice
        myDriver = new FirefoxDriver();
        //myDriver = new InternetExplorerDriver();
        //myDriver = new ChromeDriver();
        myDriver.get("http://localhost/tests/");
    }


    @Test (dataProvider="provideData")
    public void csvTest(String stepNr, String timeWaitMil, String waitForElement, String clickOnCssNameXpathLink, 
                        String valueInTextBox, String backspaceText, String assertReturnTrueFalse, 
                        String assertBy, String getUrl, 
                        String deleteCookie, String snapshot, String specialSnapshot){



        // Click on a something based on css, name xpath or link
        if (!"-".equals(clickOnCssNameXpathLink)){
            myDriver.findElement(By.name(clickOnCssNameXpathLink)).click();
        }

        // Enter value in textbox
        if (!"-".equals(valueInTextBox)){
            myDriver.findElement(By.name(clickOnCssNameXpathLink)).sendKeys(valueInTextBox);
        }


        // Delete cookies
        if (!"-".equals(deleteCookie)){
            myDriver.manage().deleteAllCookies();           
        }

        // Make snapshot of whole page
        if (snapshot.equalsIgnoreCase("true")){
            // take the screenshot of full page
            File scrFile = ((TakesScreenshot)myDriver).getScreenshotAs(OutputType.FILE);
            // prepare date to use in filename
            Date d = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");
            // Save screenshot
            try {
                FileUtils.copyFile(scrFile, new File("c:\\Temp\\screenshots\\full_page_" +dateFormat.format(d)+ ".png"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Could not make screenshot");
            }       
        }

    }


    @DataProvider
    public Iterator<Object []> provideData() throws InterruptedException, IOException
    {
        //Array with multiple csv's
        String csvFiles[] = {"C:/Users/---/Desktop/JES2.0/testingSelenium/testNG/data.csv", "C:/Users/---/Desktop/JES2.0/testingSelenium/testNG/data2.csv"};

        List<Object []> testCases = new ArrayList<>();

        //loop through csv files
        for(String csvFile:csvFiles){
                String[] data= null;
                //read csv file
                BufferedReader br = new BufferedReader(new FileReader(csvFile));

                //Skip first line in the csv file, because that only contains the column names
                String line = br.readLine();

                //loop through csv and split parameters by comma sign ,
                while ((line = br.readLine()) != null) {
                    // use comma as separator
                    data= line.split(",");
                    testCases.add(data);
                }//end of while loop

            }// end of for loop
        return testCases.iterator();        
    }


    @AfterTest
    public void closeBrowser(){
        //close browser
        myDriver.quit();
    }

}

如您所见,浏览器,URL和CSV文件是硬编码的。我希望能够将这些作为参数传递。做这个的最好方式是什么?是否可以让他们通过詹金斯?

我正在考虑构建一个仪表板,在其中可以指定要使用哪种浏览器运行哪些测试(csv文件)。

这是我正在运行的Jenkins批处理命令

java -cp C:\Users\---\Desktop\JES2.0\testingSelenium\testNG\libs\selenium-server-standalone-2.43.1.jar;C:\Users\---\Desktop\JES2.0\testingSelenium\testNG\bin org.testng.TestNG testng.xml

问题答案:

Jenkins具有内置的参数处理功能,它以自己的方式非常灵活。但是在这种情况下,由于要传递文件名作为参数,因此可以轻松地将该功能与Filesystem
List Parameter
结合使用,后者可以基于将解析文件列表的regexp构建列表。

如果您使用Maven或Ant,则可以将该参数嵌入到构建过程中,形式类似于以下形式:

  <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <systemPropertyVariables>
                <environment>${env.PARAM}</environment>
            </systemPropertyVariables>
            <suiteXmlFiles> 
                <suiteXmlFile>testng.xml</suiteXmlFile>
            </suiteXmlFiles>
        </configuration>
    </plugin>

有了这个,您可以读取传递给Maven的参数-在Jenkins中使用其内部调用程序,并在命令行上输入:

mvn install -Denv.PARAM=VALUE

所以无论哪种方式都可以工作…



 类似资料:
  • 问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对

  • 我在解一个有很多常数的非线性方程 我创建了一个用于解决以下问题的函数: 然后我想做: 但是正在解包并向函数传递太多参数,因此我得到: TypeError:terminalV()正好接受2个参数(给定6个) 那么,我的问题是,我是否可以通过某种方式将元组传递给调用的函数?

  • 问题内容: 我创建了一个新的詹金斯管道。(当前)使用单个名为的布尔选项对管道进行参数化。我的管道脚本是: 当我手动创建带有选中项的项目时,将按预期回显“ true”。但是,环境变量列表未显示。 我能够显示是否将呼叫包装在一个块中: 我将拥有比这更多的参数,因此不需要单独指定每个参数。 有没有办法将所有构建参数传送到节点的环境? 问题答案: 关键是,在管道脚本中,作业参数不会像常规作业一样自动注入到

  • 问题内容: 在我的RCP应用程序中,左侧有一个用于导航的视图,右侧有一个用于视图的文件夹。透视图看起来像这样: 我想根据用户在导航树中选择的内容打开不同的视图。认为这并不难。我的导航树视图: 这似乎很好。仅有一个小问题:我需要以某种方式将对象(例如,selectedItem)传递给我的视图,以使用户与其内容进行交互。我怎么做? 我看到了一些示例,其中一些同事编写了自己的视图,并将其放置在右侧。然后

  • 问题内容: 我正在尝试为我的程序制作验证类。我已经建立了与MySQL数据库的连接,并且已经在表中插入了行。该表由,和领域。现在,我想通过构造函数的参数在数据库中选择特定的行。 但这似乎没有用。 问题答案: 您应该使用方法设置。这既可以确保语句的格式正确,又可以防止: Java教程中有一个很好的教程,说明如何正确使用。

  • 问题内容: 我正在寻找一种将变量或字符串或任何东西传递给JButton的匿名actionlistener(或显式actionlistener)的方法。这是我所拥有的: 现在,我只是声明是一个全局变量,但是我讨厌这种工作方式。有更好的选择吗? 问题答案: 创建一个实现该接口的类。 提供具有参数的构造函数。 问题?