maven - 在 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
解决方案
此异常的主要原因是packageName.classname in Testng.xml is not equal to actual file location packageName.classname
. 如果两个地方都一样,那么这个问题有很多可能性。
- 只需执行
Eclipse> Project > Clean
,然后再次运行测试用例。它应该工作。
它在后台所做的是,它将在您的项目目录中调用 mvn eclipse:clean ,这将删除您的 .project 和 .classpath 文件,您还可以执行 mvn eclipse:eclipse - 这会重新生成您的 .project 和 .classpath 文件。从而在类路径中添加所需的类。
- 有时,我们已经安装了
testng plugin for eclipse
它有错误。解决方案与第一点相同。
Eclipse>项目>清理
- 有时
clean
项目,maven
它update
也有帮助
清理项目(右键单击 pom.xml 并清理)并更新 maven 项目(Project > Maven > Update Maven Project)
Pom.xml
4.在标签下添加src和test目录build
也有帮助
<build>
<sourceDirectory>${basedir}/src</sourceDirectory>
<testSourceDirectory>${basedir}/test</testSourceDirectory>
(...)
<plugins>
(...)
</plugins>
</build>
这个怎么运作
Maven 为 TestNG 提供了可能存储这些包的目录,然后 TestNG 开始递归查找。即使只是提供 ${baseDir} 也应该有效。似乎问题根本不在于提供目录。我不确定默认情况下它在哪里,但是在项目中提供一个有效目录允许 TestNG 爬取并找到包的位置。然后,Maven 能够将每个包中的更改构建到 target/ 文件夹中并运行
从命令提示符运行
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
。如果您只是
testng test cases
从Eclipse or other IDE
交叉检查运行,那么您已经指向 (如果我们在工作区中有多个 testng 项目,通常会发生correct testng.xml
)Run Configuration
有时卸载并重新安装
testng plugin
也会解决问题。
推荐阅读
- c# - 使用 WCF 服务参考为 Office 加载项制作安装程序
- typescript - 打字稿中的可选泛型
- arrays - 创建一个空的二维数组
- python - 如何管理用于回归的大型数据集?
- javascript - Google表格 - Javascript在编辑时向右移动光标
- javascript - Chart.js 两个 y 轴折线图工具提示值对于第二个 y 轴不正确
- mqtt - 库迁移到 AndroidX
- html - 如何在 Angular 上呈现原始 HTML
- sql - 即使表 2 没有匹配的记录,也从表 1 返回记录
- java - 使用转换器和提供者而不是属性映射时如何让 ModelMapper.validate() 成功?