首页 > 解决方案 > 在 TestNG 中运行多个类时出现 NullPointerException

问题描述

我一直在尝试在 TestNG.xml 中执行多个类,但立即得到 NullPointerException。但是当使用 Run as TestNG Test 单独执行时,相同的测试通过了。我已经添加了各种类和属性文件中使用的所有代码。

错误信息:

    org.testng.TestNGException: 
Cannot find class in classpath: com.w2a.testcases.BankManagerLogin
    at org.testng.xml.XmlClass.loadClass(XmlClass.java:77)
    at org.testng.xml.XmlClass.init(XmlClass.java:69)
    at org.testng.xml.XmlClass.<init>(XmlClass.java:55)
    at org.testng.xml.TestNGContentHandler.startElement(TestNGContentHandler.java:575)
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
    at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
    at org.apache.xerces.impl.dtd.XMLDTDValidator.emptyElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:195)
    at org.testng.xml.XMLParser.parse(XMLParser.java:38)
    at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:16)
    at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:9)
    at org.testng.xml.Parser.parse(Parser.java:152)
    at org.testng.xml.Parser.parse(Parser.java:233)
    at org.testng.TestNG.parseSuite(TestNG.java:295)
    at org.testng.TestNG.initializeSuitesAndJarFile(TestNG.java:348)
    at org.testng.TestNG.initializeEverything(TestNG.java:995)
    at org.testng.remote.support.RemoteTestNG6_12.initialize(RemoteTestNG6_12.java:22)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:98)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

下面是 testng.xml 文件的详细信息:

 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Data Driven">
    <test name="Bank Manager Login Test">
        <classes>
            <class name="com.w2a.testcases.BankManagerLogin"/>
        </classes>
    </test>
    <test name="Adding Customer Test">
        <classes>
            <class name="com.w2a.testcases.AddCustomerTest"/>
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

BankManagerLogin 类

    public class BankManagerLogin extends TestBase{

    @Test
    public void loginAsBankManager() throws Exception 
    {
        driver.findElement(By.cssSelector(OR.getProperty("BNKButton"))).click();
        Thread.sleep(4000);

    }

}

AddCustomerTest 类

public class AddCustomerTest extends TestBase {

    @Test(dataProvider="getData")
    public void AddCustomer(String firstName, String lastName, String postCode) throws Exception {
        driver.findElement(By.cssSelector(OR.getProperty("addCustButton1"))).click();
        driver.findElement(By.cssSelector(OR.getProperty("firstName"))).sendKeys(firstName);
        driver.findElement(By.cssSelector(OR.getProperty("lastName"))).sendKeys(lastName);
        driver.findElement(By.cssSelector(OR.getProperty("postCode"))).sendKeys(postCode);
        driver.findElement(By.cssSelector(OR.getProperty("addCustButton2"))).click();
    }


    @DataProvider
    public Object[][] getData()
    {
        String sheetName="AddCustomerTest";
        int rows= excel.getRowCount(sheetName);
        int cols= excel.getColumnCount(sheetName);
        Object[][] data = new Object[rows-1][cols];

        for (int rowNum=2; rowNum<=rows; rowNum++)
        {
            for (int col_Num=0; col_Num<cols; col_Num++)
            {
                data[rowNum-2][col_Num]= excel.getCellData(sheetName, col_Num, rowNum);
            }
        }
        return data;


    }

}

有一个 BaseClass 来定义 @BeforeSuite 和 @AfterSuite:

public class TestBase {

    public  WebDriver driver;
    public static Properties config = new Properties();
    public static Properties OR = new Properties();
    public static FileInputStream fis;
    public static ExcelReader excel =new ExcelReader(System.getProperty("user.dir")+"\\src\\test\\resources\\excel\\testdata.xlsx");



    //public static Logger log=Logger.get

    @BeforeSuite
    public void setUp()
    {
        if(driver==null)
        {

            try{
                fis = new FileInputStream(System.getProperty("user.dir")+"\\src\\test\\resources\\properties\\config.properties");
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();}
                try {
                    config.load(fis);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            try {

                fis= new FileInputStream(System.getProperty("user.dir")+"\\src\\test\\resources\\properties\\OR.properties");
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();}
                try {
                    OR.load(fis);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }



                if(config.getProperty("browser").equals("chrome"))
                {
                    System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\\src\\test\\resources\\executables\\chromedriver.exe");
                    driver= new ChromeDriver();
                    //log.debug("Chrome launched");
                }
                else if

                (config.getProperty("browser").equals("firefox"))
                {
                    System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir")+"\\src\\test\\resources\\executables\\geckodriver.exe");
                    driver= new FirefoxDriver();
                    //log.debug("Firefox launched");
                }

                else if

                (config.getProperty("browser").equals("IE"))
                {
                    System.setProperty("webdriver.IE.driver",System.getProperty("user.dir")+"\\src\\test\\resources\\executables\\IEDriverServer.exe");
                    driver= new InternetExplorerDriver();
                    //log.debug("Internet Explorer launched");
                }

                driver.get(config.getProperty("testSiteurl"));
                //log.debug("Navigated to: "+config.getProperty("testSiteURL"));
                driver.manage().window().maximize();
                driver.manage().timeouts().implicitlyWait(Integer.parseInt(config.getProperty("implicit.wait")), TimeUnit.SECONDS);
            }


    @AfterSuite
    public void tearDown()
    {
        driver.quit();
    }
}

******对象属性文件:******

    #Bank Manager Login button
BankManagerLogin=div > div:last-child > .btn.btn-primary.btn-lg

#Add Customer button
addCustomerButton=button[ng-click='addCust()']

#customer details
addCustButton1=button[ng-click='addCust()']
firstName=input[ng-model='fName']
lastName=input[ng-model='lName']
postCode=input[ng-model='postCd']


#click add customer button on form
addCustButton2=button[class='btn btn-default']

******配置属性文件:******

browser=chrome
testSiteURL=http://www.way2automation.com/angularjs-protractor/banking/#/login
implicit.wait=10

标签: mavennullpointerexceptiontestng

解决方案


此异常的主要原因是packageName.classname in Testng.xml is not equal to actual file location packageName.classname. 如果两个地方都一样,那么这个问题有很多可能性。

  1. 只需执行Eclipse> Project > Clean,然后再次运行测试用例。它应该工作。

它在后台所做的是,它将在您的项目目录中调用 mvn eclipse:clean ,这将删除您的 .project 和 .classpath 文件,您还可以执行 mvn eclipse:eclipse - 这会重新生成您的 .project 和 .classpath 文件。从而在类路径中添加所需的类。

  1. 有时,我们已经安装了 testng plugin for eclipse它有错误。解决方案与第一点相同。

Eclipse>项目>清理

  1. 有时clean项目,mavenupdate也有帮助

清理项目(右键单击 pom.xml 并清理)并更新 maven 项目(Project > Maven > Update Maven Project)

Pom.xml4.在标签下添加src和test目录build也有帮助

<build>
        <sourceDirectory>${basedir}/src</sourceDirectory>
        <testSourceDirectory>${basedir}/test</testSourceDirectory>
         (...)
        <plugins>
            (...)
        </plugins>
    </build>

这个怎么运作

Maven 为 TestNG 提供了可能存储这些包的目录,然后 TestNG 开始递归查找。即使只是提供 ${baseDir} 也应该有效。似乎问题根本不在于提供目录。我不确定默认情况下它在哪里,但是在项目中提供一个有效目录允许 TestNG 爬取并找到包的位置。然后,Maven 能够将每个包中的更改构建到 target/ 文件夹中并运行

  1. 从命令提示符运行testng.xml文件命令,如果您缺少它们,请检查以下内容

    a) 在命令提示符下,确保您正在导航到放置文件的testng.xml文件夹。b) 导航到该位置后,设置CLASSPATH并包含testng jar文件位置、selenium-server jar文件位置(如果您正在使用 selenium webdriver)、bin folder包含项目所有.class文件的项目位置。

    c) 例如,设置CLASSPATH=C:\Selenium\testng-5.8-jdk15.jar;C:\Selenium\selenium-server-standalone-2.31.0.jar;C:\SeleniumTests\YourProject\bin d) 现在运行命令java org.testng.TestNG testng.xml

  2. 如果您只是testng test casesEclipse or other IDE交叉检查运行,那么您已经指向 (如果我们在工作区中有多个 testng 项目,通常会发生correct testng.xmlRun Configuration

  3. 有时卸载并重新安装testng plugin也会解决问题。


推荐阅读