2017-02-01 4 views
3

Я пишу несколько автоматических тестов пользовательского интерфейса селена для моей компании, используя Java и структуру TestNG. Я определяю драйвер в классе Base, и я хочу фактически инициализировать драйвер в @BeforeTest и выйти из него в методе @AfterTest. Что такое Java-способ сделать это, предполагая, что они находятся в разных классах? Я знаю, как заставить его работать в одном классе, но не над отдельными классами. Вот мой Base.java файл:Переменная доступа в @BeforeTest и @AfterClass (TestNG) через отдельные классы?

public class Base { 

     public static WebDriver driver = null; 
     public WebDriver getDriver() { 
      driver = new ChromeDriver(); 
      return driver; 
     } 
} 

Теперь я хочу, чтобы иметь отдельный класс настройки и отдельный класс Teardown. Если бы я собирался определить все это в том же @Test, я бы сделал это так:

@Test 
public void testOne() { 

    Base b = new Base(); 
    WebDriver driver = b.getDriver(); 

    // Do test-y things here. 

    driver.quit(); 
} 

Как бы я установить это? Попытка узнать правильный способ сделать это, а не взломать что-то вместе. При необходимости я могу предоставить дополнительную информацию. Благодаря!

ответ

3

Использование наследования.

public class TestBase { 

    protected WebDriver driver; 

    @BeforeClass 
    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"); 
     driver = new ChromeDriver(options); 
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    } 

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

     //You can clean up after tests. 
     driver.close(); 
    } 
} 

И тогда наследование может быть использовано. Обратите внимание на ключевое слово extends:

public class ParticularTest extends TestBase { 

    @Test 
    public void testMethod() { 
     System.out.println("I am in testMethod."); 

     //Your driver from TestBase is accessible here. 
     //Your assertions come here. 
    } 
} 

Позже вы можете просто выполнить ParticularTest.java. Выход:

I am in setUp method. 
I am in testMethod. 
I am in tearDown method. 
+0

Спасибо! Очень полезно! – kroe761

1

Я хотел бы предложить, что вы пожалуйста DONOT прибегают к этому механизму инстанцировании webdrivers в тестах. @BeforeTest по определению будет вызываться ТОЛЬКО ОДИН за <test> тег. Так что если ваш TestNG файл свита XML имеет что-то вроде этого

<test name="MyTests"> 
    <classes> 
     <class name="com.foo.Test1"/> 
     <class name="com.foo.Test2"/> 
    </classes> 
</test> 

и если оба com.foo.Test1 и com.foo.Test2 расширить TestBase класс, то @Test методов в пределах вашего com.foo.Test2 класса связаны ударить NullPointerException при попытке доступа к driver объекту, потому что ваш @BeforeTest аннотированный метод setup() в пределах TestBase будет выполнен только один раз (для Test1), и он будет NOT выполнен для Test, так как оба класса распространяются на один и тот же базовый класс.

Я предлагаю вам обратиться к чему-то вроде this (это мой блог) для создания экземпляров веб-драйверов.

+0

На самом деле, я действительно делал что-то похожее на это. У меня есть базовый класс, который фактически создает экземпляр драйвера, а затем я расширяю класс Base с помощью класса TestBase, содержащего мои тесты до и после, а затем расширяет класс THAT до фактических классов тестов. До сих пор он работает очень хорошо! – kroe761

+0

Я изменил аннотации '@ BeforeTest' и' @ AfterTest' на '@ AfterClass' и' @ BeforeClass'. Теперь в вашем примере нет 'NullPointerException'. Тем не менее, вы даете вам преимущество, потому что это первый раз, когда я вижу состав над наследованием, реализованный в TestNG в вашем блоге. –

+0

@ GrzegorzGórkiewicz - Использование класса BeforeClass/AfterClass хорош, но все же у него есть несколько проблем.(1) Так как все методы тестирования теперь заканчиваются использованием одного и того же члена веб-ресурса данных уровня, эти методы тестирования не могут выполняться параллельно (2) Даже если тесты выполняются в последовательном порядке, если метод тестирования загрязняет браузер с точки зрения файлов cookie и т. д., будут влиять методы тестирования ниже по течению. (3) Таким образом, вы можете определенно рассмотреть возможность перехода к созданию и очистке браузеров через PreMethod/AfterMethod и сохранить экземпляр webdriver в варианте ThreadLocal, чтобы не было условий гонки. –