Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Как настроить maven проект с selenide для запуска тестов на разных окружениях и чтения профилей из pom файла вместо testNG

pom.xml
maven
java
selenide
testng
Теги: #<Tag:0x00007fedc4113488> #<Tag:0x00007fedc4113208> #<Tag:0x00007fedc4112f38> #<Tag:0x00007fedc4112d58> #<Tag:0x00007fedc4112ad8>

(Tatyana Durova) #1

Хочу запускать тесты из командой строки на разных браузерах, сейчас этим рулит local.testng.xml, он выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="XXX" verbose="5" parallel="tests">
    <test name="Tests" thread-count="1">
        <parameter name="config" value="local.conf.json"></parameter>
        <parameter name="environment" value="firefox"></parameter>
        <packages>
            <package name="oururl.script_inside"/>
            <package name="oururl.script_outside"/>
            <package name="com.meetrics.video_ads"/>
        </packages>
    </test>
</suite>

Также есть вот такой pom-файл Maven

<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>com.XXX</groupId>
    <artifactId>XXXTests</artifactId>
    <version>4.0.0</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.6</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>com.dev9</groupId>
            <artifactId>webdriver-utils</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.7</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>${suitexml.file}</suiteXmlFile>
                    </suiteXmlFiles>
                    <systemPropertyVariables>
                        <profileId>${profileId}</profileId>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!-- profiles -->
    <profiles>
        <profile>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <id>local</id>
            <properties>
                <profileId>local</profileId>
                <suitexml.file>src/test/resources/testng.local.xml</suitexml.file>
                <dataCollector>s16</dataCollector>
                <scriptFile>mtrcs_333330</scriptFile>
                <pjID>333330</pjID>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <properties>
                <profileId>dev</profileId>
                <dataCollector>s16</dataCollector>
                <scriptFile>mtrcs_333331</scriptFile>
                <pjID>333331</pjID>
                <suitexml.file>src/test/resources/testng.xml</suitexml.file>
            </properties>
        </profile>
        <profile>
            <id>staging</id>
            <properties>
                <profileId>staging</profileId>
                <activeByDefault>true</activeByDefault>
                <dataCollector>s16</dataCollector>
                <scriptFile>mtrcs_333330</scriptFile>
                <pjID>333330</pjID>
                <suitexml.file>src/test/resources/testng.xml</suitexml.file>
            </properties>
        </profile>
        <profile>
            <id>live</id>
            <properties>
                <profileId>live</profileId>
                <dataCollector>s16</dataCollector>
                <scriptFile>mtrcs_333332</scriptFile>
                <pjID>333332</pjID>
                <suitexml.file>src/test/resources/testng.xml</suitexml.file>
            </properties>
        </profile>
    </profiles>
</project>

И вот такй файлик с окружениями local.conf.json:

{
  "environments": {
    "chrome": {
      "browser": "chrome"
    },
    "firefox": {
      "browser": "firefox"
    }
  }
}

В данный момент при запуске с помощью команды
> clean test -Plocal
тесты всегда выполняются в том браузере, который казан в tesng.local.xml, то есть тут:

        <parameter name="environment" value="firefox"></parameter>

Хотелось бы передавать желаемый браузер в командой строке, например -Dbrowser=chrome или -Plocal,chrome. Не очень понимаю как отвязаться от tesng в данном случае и что надо сделать?


(Vasiliy Rakshin) #2

Куда тестнг передаёт parameter name="environment"? Вот доработать то место, чтобы оно ещё принимало значения из командной строки - System.getProperty(environment)


(Tatyana Durova) #3

Testng их берет из json с environments:

{
  "server": "hub-cloud.browserstack.com",
  "user": "xxx",
  "key": "xxx",
  "capabilities": {
    "browserstack.debug": true
  },
  "environments": {
    "win7_chrome56": {
      "os": "Windows",
      "os_version": "7",
      "browser": "Chrome",
      "browser_version": "56.0"
    },
    "win10_chrome55": {
      "os": "Windows",
      "os_version": "10",
      "browser": "Chrome",
      "browser_version": "55.0"
    },
    "sierra_chrome56": {
      "os": "OS X",
      "os_version": "Sierra",
      "browser": "Chrome",
      "browser_version": "56.0"
    },
    "win7_firefox52": {
      "os": "Windows",
      "os_version": "7",
      "browser": "Firefox",
      "browser_version": "52.0"
    },
    "sierra_firefox52": {
      "os": "OS X",
      "os_version": "Sierra",
      "browser": "Firefox",
      "browser_version": "52.0"
    },
    "elcapitan_safari9.1": {
      "os": "OS X",
      "os_version": "El Capitan",
      "browser": "Safari",
      "browser_version": "9.1"
    },
    "win7_ie11": {
      "os": "Windows",
      "os_version": "7",
      "browser": "IE",
      "browser_version": "11.0"
    },
    "win10_ie11": {
      "os": "Windows",
      "os_version": "10",
      "browser": "IE",
      "browser_version": "11.0"
    },
    "win10_edge": {
      "os": "Windows",
      "os_version": "10",
      "browser": "Edge",
      "browser_version": "14.0"
    }
  }
}

(Tatyana Durova) #4

Может вообще все на профили мавен переделать, без этого файла tesng?


(Vasiliy Rakshin) #5

Ещё раз, у вас в коде где-то, например в бефорсьют, начинает использоваться эта переменная environment. Вот в этом месте надо дописать чтобы сначала было считывание из командной строки, и если там пусто, то использовать то что передаёт сам тестНГ.


(Tatyana Durova) #6

Спасибо, вроде здесь:

@BeforeClass
    @Parameters({"environment", "config"})
    public void setUp(@Optional("chrome") String environment, @Optional("local.conf.json") String config) throws IOException, ParseException {
        logger.info("Running tests on environment " + environment);
        driver = WebDriverFactory.getInstance(environment, config);
        driver.manage().window().maximize();
        WebDriverRunner.setWebDriver(driver);
        open(TEST_SUITE);
        page.testSuiteLogin();
        $(SCRIPT_INJECT_FIELD).isDisplayed();
    }

То есть надо в начало этого метода добавить примерно такой код и все?

String commandlineEnvironment = System.getProperty(environment);
        if (commandlineEnvironment!=null){
            environment=commandlineEnvironment;
        }

(Vasiliy Rakshin) #7

Да, и в командной строке можно будет передавать -Denvironment=la-la-la.
И я бы проверку заменил на if (!commandlineEnvironment.isEmpty()), потому что проверка на не нулл это немного другое. - я посмотрел что отдаёт System.getProperty - да ваш вариант будет лучше.


(Tatyana Durova) #8

@BabyRoot А как то специально надо такие параметры командной строки в javadoc описывать или просто plain text?
Если надо, то какие тэги?


(Vasiliy Rakshin) #9

Так это как у вас заведено так и делайте.
Если вы вынесли получение параметра из к. строки в отдельный метод, то думаю, достаточно добавить небольшое описание к методу какой параметр он берёт из к. строки и какой формат должен быть у этого параметра или какие значения, т.е. да это javadoc.