TestNG: контрольный пример игнорируется - PullRequest
1 голос
/ 20 сентября 2019

Я использую TestNG framework для написания тестовых случаев для моего Android приложения.Для которого я использую Appium инструмент тестирования.

Для этого я определил следующие файлы:

  • pom.xml file - требуется для зависимостей
  • One BaseTest.java class
  • Два дочерних класса, которые расширены из файла BaseTest.java
  • testng.xml - определяет в нем запущенные тестовые классы.

Для лучшего пониманиямой вопрос публикации классов и XML-файлов.

Это pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.phynart.smarthome.testing</groupId>
    <artifactId>android-appium</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>

        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>java-client</artifactId>
            <version>7.1.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

Это BaseTest.java класс

import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;

public class BaseTest {


    @BeforeSuite
    public void setUp()
    {
    }

    @AfterSuite
    public void tearDown()
    {

    }
}

Это FirstTest.java класс

import io.appium.java_client.MobileBy;
import io.appium.java_client.MobileElement;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import io.appium.java_client.touch.WaitOptions;
import io.appium.java_client.touch.offset.PointOption;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import scenarios.BaseTest;

import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class FirstTest extends BaseTest {

    private AndroidDriver<MobileElement> mAndroidDriver;

    @BeforeTest
    protected  void setUpDriver() throws MalformedURLException {

        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
        desiredCapabilities.setCapability("device", "Android");

        desiredCapabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "abfg34e");
        desiredCapabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");

        desiredCapabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "7.0");
        desiredCapabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator1");
        desiredCapabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.example.test");

        desiredCapabilities.setCapability(MobileCapabilityType.APP,"/home/desktop/app-developer-debug.apk");
        desiredCapabilities.setCapability(MobileCapabilityType.NO_RESET, "true");

        mAndroidDriver = new AndroidDriver(new URL(Constants.BASE_URL), desiredCapabilities);
        System.out.println("setUpDriver() :: time : "+ DateFormat.getDateTimeInstance().format(System.currentTimeMillis()));
    }

    @Test(groups = "app_screen_group_1", priority = 1)
    public void splashScreen_1() throws InterruptedException {
        System.out.println("splashScreen_1() :: startTime : "+ DateFormat.getDateTimeInstance().format(System.currentTimeMillis()));
        Thread.sleep(7000);
    }


    @Test(groups = "app_screen_group_1", priority = 2)
    public void splashScreen_2() throws InterruptedException {
        System.out.println("splashScreen_2() :: startTime : "+ DateFormat.getDateTimeInstance().format(System.currentTimeMillis()));
        MobileElement menuElement = mAndroidDriver.findElementByAccessibilityId("More options");
        menuElement.click();

        Thread.sleep(10);
        MobileElement splashElement = mAndroidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"Splash\")");
        splashElement.click();
    }
}

Это SecondTest.java класс

 import io.appium.java_client.MobileBy;
    import io.appium.java_client.MobileElement;
    import io.appium.java_client.TouchAction;
    import io.appium.java_client.android.AndroidDriver;
    import io.appium.java_client.remote.AndroidMobileCapabilityType;
    import io.appium.java_client.remote.MobileCapabilityType;
    import io.appium.java_client.touch.WaitOptions;
    import io.appium.java_client.touch.offset.PointOption;
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.testng.annotations.BeforeTest;
    import org.testng.annotations.Test;
    import scenarios.BaseTest;

    import java.net.MalformedURLException;
    import java.net.URL;
    import java.text.DateFormat;
    import java.time.Duration;
    import java.util.List;
    import java.util.concurrent.TimeUnit;

    public class SecondTest extends BaseTest {

        private AndroidDriver<MobileElement> mAndroidDriver;


        @Test(groups = "app_screen_group_2", priority = 1)
        public void logInScreen_1() throws InterruptedException {
            System.out.println("logInScreen_1() :: startTime : "+ DateFormat.getDateTimeInstance().format(System.currentTimeMillis()));
            Thread.sleep(7000);
        }


        @Test(groups = "app_screen_group_2", priority = 2)
        public void logInScreen_2() throws InterruptedException {
            System.out.println("logInScreen_2() :: startTime : "+ DateFormat.getDateTimeInstance().format(System.currentTimeMillis()));
            MobileElement menuElement = mAndroidDriver.findElementByAccessibilityId("More options");
            menuElement.click();

            Thread.sleep(10);
            MobileElement logInElement = mAndroidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"Log in\")");
            logInElement.click();
        }
    } 

Это testng.xml файл

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="androidapp" group-by-instances="true">

    <test name="FirstScenario_1" >

        <classes>
            <class name="scenarios.FirstTest" ></class>
            <class name="scenarios.SecondTest"></class>
        </classes>
    </test>

   <!-- Following scenario runs perfectly if I have each separate class in separate test name. But in above case scenario it is not working properly, it gives Test ignored error for second method of FirstTest.java
<test name="secondScenario_1" >

        <classes>
            <class name="scenarios.FirstTest" ></class>
        </classes>
    </test>

 <test name="secondScenario_2" >

        <classes>
            <class name="scenarios.SecondTest" ></class>
        </classes>
    </test>-->
</suite>

Когда я запускаю этот код с помощью инструмента appium, затем на второй функцииsplashScreen_2() из FirstTest.java класс получил ошибку Тест игнорируется и он не работает должным образом.Но когда я делаю комментарий secondScnario_2 в testng.xml файле и комментарии FirstScenario_1, тогда мои тесты запускаются правильно (как я уже упоминал в комментарии), и приложение для Android выполняет каждую функцию должным образом.

Но я хочувыполнить все классы в <test> </test> функции в testng.xml.

Если я использую secondScnario_2 в testng.xml файле, тогда мне нужно дать отдельное имя теста для каждого сценария.И я хочу использовать только одно имя теста.Так вот, когда я использую FirstScenario_1 в testng.xml файле, почему их ошибка test игнорируется здесь происходит?

1 Ответ

1 голос
/ 25 сентября 2019

Исходя из того, что вы описали в комментариях, я думаю, что вы хотите, чтобы все было по порядку, определяя все классы в одном тесте.Затем вы должны удалить приоритеты и группы и запустить его с этим xml с preserve-order="true".Это должно запустить тест в том порядке, в котором они определены в xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="androidapp" >

    <test name="FirstScenario_1" preserve-order="true">

        <classes>  
         <class name="scenarios.FirstTest" >
               <methods> 
                  <include name="setUpDriver" />
                  <include name="splashScreen_1" /> 
                  <include name="splashScreen_2" />
               </methods> 
        </class>
            <class name="scenarios.SecondTest">
               <methods> 
                  <include name="logInScreen_1" />
                  <include name="logInScreen_2" />
               </methods>
          </class>
        </classes>
    </test>
</suite>

. Вы также можете использовать @dependsOnMethods для запуска методов в нужном вам порядке.Посмотрите на это .Описанный там порядок также поможет вам решить эту проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...