2017-02-08 2 views
2

Я запускаю автоматические тесты Selenium с TestNG. Когда я запускаю TestNG Suite, все работает отлично. Но когда я запускаю Maven Test, они терпят неудачу. Я очень смущен, почему они будут работать по одному сценарию, а не другому. Вот общий план испытаний:Тесты TestNG терпят неудачу при запуске как тест Maven, но проходят при запуске в качестве набора TestNG

Base.java

public class Base { 

    public WebDriver driver = null; 

    public WebDriver getLocalDriver() { 
     driver = new FirefoxDriver(); 
     return driver; 
    } 

TestBase.java

public class TestBase extends Base { 

    @BeforeTest 
    public void beforeTest() { 
     Base b = new Base(); 
     driver = b.getLocalDriver(); 
    } 

    @AfterTest 
    public void afterTest() { 
     driver.quit(); 
    } 

LoginTests.java сообщение

public class LoginTests extends TestBase { 

    @Test 
    public void TestOne() { 

     driver.get("http://www.company.com"); 
     // ^^^ driver == null right here (line 28) 
    } 

Ошибка:

java.lang.NullPointerException 
    at com.company.automation.ecom.tests.LoginTests.TestOne(LoginTests.java:28) 

редактировать: pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.19.1</version> 
       <configuration> 
        <suiteXmlFiles> 
         <suiteXmlFile>testng.xml</suiteXmlFile> 
        </suiteXmlFiles> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <groupId>com.company.automation</groupId> 
    <artifactId>ecom</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>ecom</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 

     <dependency> 
      <groupId>org.testng</groupId> 
      <artifactId>testng</artifactId> 
      <version>6.8</version> 
      <!--<scope>test</scope> --> 
     </dependency> 

     <dependency> 
      <groupId>org.seleniumhq.selenium</groupId> 
      <artifactId>selenium-java</artifactId> 
      <version>3.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.seleniumhq.selenium</groupId> 
      <artifactId>selenium-java</artifactId> 
      <version>3.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.seleniumhq.selenium</groupId> 
      <artifactId>selenium-chrome-driver</artifactId> 
      <version>3.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>io.github.bonigarcia</groupId> 
      <artifactId>webdrivermanager</artifactId> 
      <version>1.5.0</version> 
     </dependency> 

    </dependencies> 
</project> 

testng.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="ECOM Suite" parallel="tests" thread-count="2"> 

    <test verbose="2" name="Chrome"> 
     <parameter name="browserName" value="chrome"/> 
     <parameter name="nodeURL" value="http://10.11.25.170:5552/wd/hub"/> 
     <packages> 
      <package name="com.company.*"></package> 
     </packages> 
    </test> 

    <test verbose="2" name="Firefox"> 
     <parameter name="browserName" value="firefox"/> 
     <parameter name="nodeURL" value="http://10.11.25.170:5551/wd/hub"/> 
     <packages> 
      <package name="com.company.*"></package> 
     </packages> 
    </test> 

</suite> 
+1

Что вы имеете в виду 'работать как Maven Test'? Как выглядит ваш pom-файл? Какой плагин вы используете для запуска? – khmarbaise

+0

В Затмении. Когда я нажимаю правой кнопкой мыши на проекте и выбираю 'Run As' ->' Maven Test', он терпит неудачу. Но когда я нажимаю правой кнопкой мыши на 'testng.xml' и выбираю' Run As' -> 'TestNG Suite', он проходит. Я пытаюсь запустить проект в maven, поэтому у меня будет больше возможностей при интеграции проекта с Jenkins. Также добавлен pom.xml. – kroe761

+1

Есть ли еще тесты? Как выглядит 'testng.xml'? –

ответ

4

Я очень смущен, почему они будут работать в рамках одного сценария и не другой.

Так было я, когда я впервые обнаружил, что TestNG делает (хорошее) использование многопоточности.

Попробуйте изменить @BeforeTest и @AfterTest аннотации к @BeforeMethod и @AfterMethod. Это было бы самым простым решением.

Кроме того, сохраняя WebDriver в статическом состоянии ThreadLocal может быть ключом к успеху.

Рассмотрим это:

public class TestBase { 

    protected static ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>(); 
    protected String abc; 

    @BeforeMethod 
    public void setUp(){ 
     System.out.println("I am in setUp method."); 

     //WebDriver instantiation etc. 
     System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); 

     ChromeOptions options = new ChromeOptions(); 
     options.addArguments("--start-maximized", "--disable-cache"); 
     webDriver.set(new ChromeDriver(options)); 
     webDriver.get().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    } 

    @AfterMethod 
    public void tearDown(){ 
     System.out.println("I am in tearDown method."); 
     //You can clean up after tests. 
     //webDriver.get().quit(); 
     webDriver.get().quit(); 
    } 
} 

В двух отдельных файлах:

public class Test1 extends TestBase { 

    @Test 
    public void goToGoogle() { 
     System.out.println("Google"); 
     String googleURL = "http://google.com/"; 
     webDriver.get().get(googleURL); 
     assertTrue(webDriver.get().getCurrentUrl().contains("google"), "We are on Google!"); 
    } 
} 

и

public class Test2 extends TestBase { 

    @Test 
    public void goToStackOverflow() { 
     System.out.println("SO!"); 
     String stackOverflowAddress = "http://stackoverflow.com/"; 
     webDriver.get().get(stackOverflowAddress); 
     assertTrue(webDriver.get().getCurrentUrl().contains("stack"), "We are on SO!"); 
    } 
} 
Смежные вопросы