Тесты падают после прохождения первого тестового класса

Одному мне интересно взглянуть на testng.xml? :wink: Да и как собственно происходит запуск при использовании той самой xml? Maven, руки?

Если пускать руками-то фелятся оба класса. Если мавеном то первый класс отрабатывает, а второй фейлится.
вот код testng.xml не смотрите что названия классов другие…у себя переделал немного для наглядности.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <test verbose="2" name="Test">
    <classes>
      <class name="iGovTests.DocumentsTest"/>
       <class name="iGovTests.DocumentsTest2"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

вот на всякий случай 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>
  <groupId>iGovAT</groupId>
  <artifactId>iGovAT</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
  <build>
    <plugins>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>           
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.18.1</version>
          <inherited>true</inherited>
          
            <configuration>
          <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
          </suiteXmlFiles>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
      <dependency>
          <groupId>org.testng</groupId>
          <artifactId>testng</artifactId>
          <version>6.7</version>
          <scope>test</scope>
      </dependency>
   <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.48.2</version>
    </dependency> 
  </dependencies>
</project>

простите, уточню. запуск через testng.xml и maven дает один и тот же результат(первый класс проходит, второй падает)
при запуске через временный файл testng-customsuite.xml(проект-run as) падает всё

а почему у вас клас нейм не совпадает с названиями тестовых классов ?

1 лайк

название тестовых классов соответствует указанному в testng.xml

Не совсем…

@BeforeTest: The annotated method will be run before any test method belonging to the classes inside the tag is run. друг
поменяй на беформетод посмотри что получится ?

У вас 2 класса, которые наследуют TestBase. При этом экземпляр ApplicationManager создается лишь однажды. О чем речь собственно?

П.С. Либо разносите классы по разным test тэгам, либо меняйте аннотацию.

это не решение, так как в любом случае придется запускать и весь Suite и будет не один класс в тесте.
какие еще варианты?

в смысле не решение ? вам показал ив чем причина и даже указали как решить , или вы Дмитрий не поняли в чем загвоздка ?

скорее всего не понял,поясните пожалуйста

У вас 1 бефортест он запустится перед тегом тест , 1 бефор тест 1 экземпляр app!!! а надо 2 экземпляра в вашем случае для каждого тестового класса

Вы еще раз простите за глупые вопросы(только начинаю изучать автоматизацию и программирование).
с аннотацией BeforeClass конечно все будет работать, но я считаю это нерациональный подход, так как очень много времени будет занимать старт/стоп браузера каждый раз.
Вопрос: что нужно доработать в коде, что бы создавалось нужно кол-во экземпляров ApplicationManager?

Тут дело скорее в понимании основных концепций ООП и механики работы подключаемых библиотек.

На пальцах касательно ООП: у вас есть 2 тестовых класса, каждый из которых наследует TestBase, т.е. физически у вас будет 2 независимых объекта ApplicationManager при запуске.

На пальцах касательно механики работы TestNG: у вас есть xml, в котором оба класса физически являются частью “тестовой группы”:

<test verbose="2" name="Test">

Далее вы в TestBase заключаете ключевой метод, отвечающий за инициализацию объекта ApplicationManager, под аннотацию @BeforeTest. Фактически, глядя на xml, вы ставите ограничение на вызов инициализатора ApplicationManager. Другими словами, он будет вызван лишь раз - при обработке первого класса. Отсюда и вытекает вполне логичный NPE, т.к. второй объект остается неинициализированным. Вся ирония в том, что вы сами это ограничение и поставили.

Исходя из того, что вас категорически не устраивает инициализация драйвера на уровне класса, выхода тут 2:

  • Не требующий изменений в коде:
<suite name="Suite">
  <test verbose="2" name="Test1">
    <classes>
      <class name="iGovTests.DocumentsTest"/>
    </classes>
  </test>
  <test verbose="2" name="Test2">
    <classes>
       <class name="iGovTests.DocumentsTest2"/>
    </classes>
  </test>
</suite>
  • Вынуждающий менять область видимости ApplicationManager:
protected static ApplicationManager app;

При этом, вы автоматически добавляете себе головной боли при потенциальном внедрении масштабирования. Не говоря о том, что подобное объявление (в силу специфики вашей реализации) с точки зрения ООП - будет весьма абсурдным.

2 лайка

Делайте

static ApplicationManager app;

вот вам и весь ответ.

1 лайк

Всем огромное спасибо за помощь.Разобрался.Может напоследок литературы посоветуете?

Для “спасибо” есть спец. кнопка. :wink:

А так же - отметка решенного вопроса:

Вам литературы художественной, или может немного сузите выборку - программирование / тестирование / автоматизация?

Тестирование и автоматизация

Вот эту тему смотрели? Там куча линок на полезную литературу.

1 лайк

Спасибо:)