Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Webdriver/Selenium + JUnit + Ant - как одновременно запустить тесты и управлять?


(XGor) #1

Коллеги, приветствую!

Есть такая ситуация (общее описание):

1. Есть тесты Selenium содержащиеся в package1, package2 и package3.

2. Сейчас они запускаются Ant'ом так:

    <target name="Test All" depends="compile">
        <antcall target="Suite1"/>
        <antcall target="Suite2" />
        <antcall target="Suite3" />
    </target>

где Suite* - описание какие тесты запускать.

Проблема - с ростом числа тестов этот зоопарк будет множиться и очень хочется параллельно пускать.

И тут нюанс - Suite1 и Suite2 допустим могут быть запущены параллельно, но Suite3 может быть запущен только по окончании Suite1.

Как быть? Какие есть варианты?

Спасибо!

 


(Mykhailo Poliarush) #2

ну насколько я помню ant (уже давно его не использовал) есть параллельный запуск целей <parallel>

выглядит это примерно так

 

<target name="junitParallelIdea">
  <parallel>
    <antcall target="testSomeJUnit" />
    <antcall target="testOtherJUnit" />
  </parallel>
</target>

 

http://blog.code-cop.org/2009/09/parallel-junit.html

кроме этого, если вам необходимо работать с зависимостью, то это можно или прописать в самих целях с помощью depends аттрибута

или же например запускать миксом последовательного и параллельного запуска, например

 

     A
    / \
   B   C
    \
     D

 

  <target name="build-all">
    <ant antfile="../A/build.xml" dir="../A" target="build" inheritAll="false" />
    <parallel threadcount="${cpucount}">
      <ant antfile="../B/build.xml" dir="../B" target="build" inheritAll="false" />
      <ant antfile="../C/build.xml" dir="../C" target="build" inheritAll="false" />
    </parallel>
    <ant antfile="../D/build.xml" dir="../D" target="build" inheritAll="false" />
  </target>

http://www.franke.ms/#ant-synchronized.wiki


(Sergey Korol) #3

Замените JUnit на TestNG и вопрос параллельного запуска с зависимостями будет решаться на уровне последнего, что является более корректным и гибким решением. Пусть Ant отвечает на вопросы - что / при помощи чего собирать и запускать. А на вопрос - как запускать - пусть отвечает специально предназначенное для этого средство - TestNG.

<?xml version="1.0"?>
 
<project name="Your project's name">
    <!-- Properties storage -->
    <property file="build.properties"/>
 
    <!-- Project's folders locations -->
    <property name="root.folder" value="${workspace.location}"/>
    <property name="tests.folder" value="${workspace.location}"/>
    <property name="bin.folder" value="${root.folder}/bin"/>
    <property name="tests.src.folder" value="${tests.folder}/src/"/>
    <property name="tests.results.folder" value="${root.folder}/results"/>
 
     <!-- Title for ReportNG -->
    <property name="report.title" value="Automated tests report for your project's name"/>
 
    <!-- Path for our jars -->
    <path id="libs.path.ref">
            <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>
 
    <!-- Compile classes -->
    <target name="compileTests">
        <delete dir="${bin.folder}"/>
        <mkdir dir="${bin.folder}"/>
 
        <javac srcdir="${tests.src.folder}" destdir="${bin.folder}/" target="1.7" debug="true" classpathref="libs.path.ref" />
    </target>
 
    <!-- Define TestNG and prepare results folder -->
    <target name="prepareForRunning" depends="compileTests">
        <taskdef resource="testngtasks" classpathref="libs.path.ref"/>
 
        <delete dir="${tests.results.folder}" />
        <mkdir dir="${tests.results.folder}" />
    </target>
 
    <!-- Run TestNG suite -->
    <target name="runTests" depends="compileTests, prepareForRunning">
        <testng haltOnfailure="false"
             outputdir="${tests.results.folder}"
             workingDir="${root.folder}"
             useDefaultListeners="false" >
 
            <sysproperty key="org.uncommons.reportng.escape-output" value="false" />
            <sysproperty key="org.uncommons.reportng.title" value="${report.title}"/>
 
            <classpath>
                <path refid="libs.path.ref"/>
                <pathelement location="${bin.folder}"/>
            </classpath>
 
            <xmlfileset file="${tests.folder}/src/suites/your_suite.xml" />
        </testng>
    </target>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 
<suite name="Test cases executed:" parallel="tests" thread-count="2">
 
    <test name="test1">
    </test>
 
    <test name="test2">
    </test>
 
</suite>

При этом, депенденси могут быть указаны в самом коде.


(XGor) #4

Спасибо!

target parallel работает.

По поводу TestNG - попробую.