【问题标题】:TestNG : Test case is ignoredTestNG : 测试用例被忽略
【发布时间】:2020-01-21 11:40:56
【问题描述】:

我正在使用TestNG 框架为我的Android 应用程序编写测试用例。我正在为此使用Appium 测试工具。

为此,我定义了以下文件:

  • pom.xml 文件 - 依赖项所必需的
  • 一个BaseTest.java
  • 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.example.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 工具运行此代码时,然后在 FirstTest.java 类的第二个函数 splashScreen_2() 上出现错误 忽略测试 & 它运行不正常。但是,当我在 testng.xml 文件中取消注释 secondScnario_2 并评论 FirstScenario_1 时,我的测试用例运行正常(正如我在评论中提到的那样)& android 应用程序一个接一个地正确执行每个函数。

但我想在testng.xml 中执行&lt;test&gt; &lt;/test&gt; 函数中的所有类。

如果我在testng.xml 文件中使用secondScnario_2,那么我需要为每个场景提供单独的测试名称。而且我只想使用一个测试名称。所以这里当我在testng.xml 文件中使用FirstScenario_1 时,为什么这里会出现test被忽略的错误?

【问题讨论】:

  • 您在SecondTest.java 中的课程称为FirstTest。至少在您提供的 sn-p 中。
  • 您究竟是如何运行测试的?从 cmd 还是从 IDE?你能发布你得到的整个异常吗?
  • 使用它来运行 FirstScenario_1 的测试。在各自的类下添加每个方法。 &lt;classes&gt; &lt;class name="yourclass"&gt; &lt;methods&gt; &lt;include name="yourmethod" /&gt; &lt;/methods&gt; &lt;/class&gt; &lt;/classes&gt;
  • @user1207289 感谢您的回复,我尝试了您的解决方案。但在这种情况下,两个类的方法都会跳。 testNg 运行FirstTest.java 类方法setUpDriver() splashScreen() 然后SecondTest.javaclass 方法logInScreen_1() 然后再次运行FirstTest.java 类方法splashScreen_2() 之后运行SecondTest.javaclass 方法logInScreen_2()。我想按优先级顺序运行每个测试类和该类的方法。

标签: java android selenium testng appium


【解决方案1】:

根据您在 cmets 中描述的内容,我认为您希望通过在一个测试中定义所有类来按顺序运行所有内容。然后,您应该删除优先级和组,并使用带有 preserve-order="true" 的这个 xml 运行它。这应该按照它们在 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 按您想要的顺序运行方法。看看this。那里描述的顺序也应该可以帮助您解决这个问题

【讨论】:

  • @Mangesh Sambare 很高兴为您提供帮助!
猜你喜欢
  • 2020-01-01
  • 2018-10-26
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多