[英]TestNG @BeforeClass initialization code not running before Test
我正在用Selenium,TestNG编写测试代码。 我试图在@BeforeClass
部分设置一些元素,因为我在同一页面上重复了这些操作。 但是我得到了空指针异常。 有没有解决此问题的方法?
public class RunTest {
private static WebElement user;
private static WebElement pass;
private static WebElement login;
@BeforeClass
public static void driveraBaglan() {
//Driver is declared here. I removed it to give the simple code.
user = driver.findElement(By.id("user"));
pass = driver.findElement(By.id("pass"));
login = driver.findElement(By.xpath("//button[contains(.,'Log In')]"));
statusMessage = driver.findElement(By.id("login-status-message")).getText();
}
@Test(priority=1)
public void loginNoInfo() {
user.clear();
pass.clear();
}
我在user.clear()
, pass.clear()
和login.click()
函数上收到空指针错误。 该页面上的所有测试都在同一页面上运行。 我不想在页面上的每个测试中使用重复的“按ID查找元素”标签。
@BeforeTest: The annotated method will be run before any test method belonging to the classes inside the <test> tag is run. @BeforeClass: The annotated method will be run before the first test method in the current class is invoked
尝试更改注释
@BeforeTest
public static void driveraBaglan() {
//Driver is declared here. I removed it to give the simple code.
user = driver.findElement(By.id("user"));
pass = driver.findElement(By.id("pass"));
login = driver.findElement(By.xpath("//button[contains(.,'Log In')]"));
statusMessage = driver.findElement(By.id("login-status-message")).getText();
}
我从未使用过TestNG,但确实使用过Junit 。 尝试复制您的示例,我获得了以下异常:
[TestNG] Running:
/Users/davide.patti/Library/Caches/IntelliJIdea2017.3/temp-testng-customsuite.xml
java.lang.NullPointerException
at TestSO.loginNoInfo(TestSO.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
原因是因为在导入的类中,我使用的是Junit的BeforeClass:
import org.junit.BeforeClass;
import org.testng.annotations.Test;
而不是TestNG。
如果空指针异常相同,请确保导入的类是正确的类:
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
我因意外更改而遇到了同样的问题。
当您遇到以下困境时(在启用测试方法的情况下将该类设置为禁用的测试类),您可能还会在@BeforeClass或@BeforeTest中初始化的对象上获得空指针异常。
@Test(enabled=false)
public class TestClass{
A a;
@BeforeClass
public void doBeforeClass(){
a=new A();
//
}
@Test
public void test1(){
a.callMethod1();
}
@Test
public void test2(){
a.callMethod2();
}
}
在这里,当通过仅对类放置@Test(enabled=false)
来运行全套件时,由于那里存在@Test
批注,因此套件仍将在类中运行单个测试。 但是,由于@BeforeClass
并未针对整个类运行,因此对象'a'未初始化,并且将导致空指针异常。
在这种情况下,也需要将各个@Test
批注更改为@Test(enabled=false)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.