【问题标题】:Testng XML not accepted by AWS Device FarmAWS Device Farm 不接受 Testng XML
【发布时间】:2017-09-24 07:21:21
【问题描述】:

我正在尝试使用 testng.xml...,看起来 Device Farm 忽略了整个文件。

我的例子很简单。我有一个实例化测试类的工厂类,这就是我的 xml 文件的样子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
    <test name="test">
        <classes>
            <class name="Factory"/>
        </classes>
    </test>
</suite>

我什至尝试手动排除方法

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
    <test name="test">
        <classes>
            <class name="Factory"/>
            <class name="TestSingleUrl">
                    <methods>
                        <exclude name="testCorrectSiteKey"/>
                        <exclude name="testIsTagImplemented"/>
                        <exclude name="testHttpsScheme"/>
                        <exclude name="testCorrectTagName"/>
                        <exclude name="testCorrectBootstrapPath"/>
                    </methods>
            </class>
        </classes>
    </test>
</suite>

但我得到一个“无法调用方法:要么使其成为静态,要么创建一个非参数构造函数”。这意味着 Device Farm 正在尝试运行 TestSingleUrl 类中的方法。但是调用这些测试的应该是工厂

有谁知道我们如何让 Device Farm 接受我们的 xml 文件?

这是我的工厂类:

public class Factory{

    private String targetSiteKey;

    //Data Provider that consumes the first line, which contains the target sitekey of the tag
    @DataProvider(name = "urlProvider")
    public Iterator<Object[]> createData() throws IOException {
        List<String> lines = IOUtils.readLines(new InputStreamReader(this.getClass().getResourceAsStream("Urls.csv")));
        List<Object[]> objectArrays = lines.stream().map(x -> new Object[]{x}).collect(Collectors.toList());

        Iterator<Object[]> itr = objectArrays.iterator();
        targetSiteKey = itr.next()[0].toString();

        return itr;
    }

    @Factory(dataProvider="urlProvider")
    public Object[] creatingTests(String url){
        System.out.println(System.currentTimeMillis());
        String siteKey=null;
        String path = null;
        String tagName = null;
        WebElement browsi;
        try{
            RemoteWebDriver driver = DriverWrapper.getDriver();
            driver.get(url);
            browsi = driver.findElement(By.id("browsi-tag"));

            tagName = browsi.getTagName();
            siteKey = browsi.getAttribute("data-sitekey");
            path = browsi.getAttribute("src");

        }catch(Exception ignored){}
        finally{
            return new Object[] {new TestSingleUrl(targetSiteKey,siteKey,path,tagName,url)};
        }
    }
}

这是我的 TestSingleUrl 类:

public class TestSingleUrl {
    private String targetSiteKey,siteKey,path,tagName,url;

    public TestSingleUrl(String targetSiteKey,String siteKey, String path, String tagName,String url){
        this.targetSiteKey = targetSiteKey;
        this.siteKey=siteKey;
        this.path=path;
        this.tagName=tagName;
        this.url=url;
    }

    @Test
    public void testCorrectSiteKey(){
        System.out.println(url);
        Assert.assertEquals(siteKey, targetSiteKey);
    }

    @Test
    public void testIsTagImplemented(){
        System.out.println(url);
        Assert.assertFalse(siteKey.isEmpty());
        Assert.assertFalse(tagName.isEmpty());
        Assert.assertFalse(path.isEmpty());
    }

    @Test
    public void testHttpsScheme(){
        System.out.println(url);
        Assert.assertTrue(path.contains("https"));
    }

    @Test
    public void testCorrectTagName(){
        System.out.println(url);
        Assert.assertEquals(tagName,"script");
    }

    @Test
    public void testCorrectBootstrapPath(){
        System.out.println(url);
        Assert.assertTrue(path.contains("middycdn-a.akamaihd.net/bootstrap/bootstrap.js"));
    }
}

我认为我收到的错误消息是因为设备场正在尝试使用它找到的 @Test 注释运行每个方法。如果它正在读取我的 xml 文件,它就不会发生。

RocketRaccoon

【问题讨论】:

  • 你能分享一下Factory和TestSingleUrl吗?看起来你错误地实现了工厂模式。
  • 嘿@RocketRaccoon ,我只是把课程。我不认为我的课程有错误..因为我可以在本地设备上运行它..问题是当我将它发送到设备场时。
  • 你是如何在那里执行它的?
  • 稍微了解一下 AWS Device Farm。那么,您是否尝试过将 testng.xml 放在 *-test.jar 依赖项的根目录下?另外,您的代码看起来不错,我认为这是 AWS 的配置问题。
  • 我正在使用 *-test.jar 根目录下的 testng.xml 文件创建 zip 文件,我正在使用带有 Surefire 插件和其他插件的 Maven。我看到他们不支持每个 Testng 功能,但他们说他们支持基本的 xml 配置(比如要运行的类)。但我已经尝试了好几天......

标签: xml testng device


【解决方案1】:

我不确定,但我相信您应该能够将 testng.xml 放在资源目录中并从 pom.xml 中引用它。

看起来这篇文章展示了如何从 pom.xml 中引用 testng.xml: How to call testng.xml file from pom.xml in Maven

当您构建项目时,它将被包含在 jar 中。

awslabs 项目使用这个 mvn 命令构建它

mvn clean package -DskipTests=true

https://github.com/awslabs/aws-device-farm-appium-tests-for-sample-app

[更新] 我从 awslabs 下载了示例项目并将其导入到 eclipse 中。 然后我将此插件添加到 pom.xml 文件中:

  <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-plugin</artifactId>
           <version>2.12.4</version>
           <configuration>
              <suiteXmlFiles>
                 <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
              </suiteXmlFiles>
           </configuration>
        </plugin>     

然后我在./src/test/resources/中创建了testng.xml

我复制并粘贴了此处提供的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
    <test name="test">
        <classes>
            <class name="Factory"/>
        </classes>
    </test>
</suite>

然后我使用

构建项目
mvn clean package -DskipTests=true

这在目标目录中生成了一个 zip-with-dependencies.zip 文件。

我通过创建一个新项目并选择 Appium Java Testng 作为我要运行的测试类型,将此测试包上传到设备场。

我遇到了这个解析错误:

Failed to generate the test suites[TestNG] [ERROR] Cannot find class in classpath: Factory

这是意料之中的,因为我的类路径中没有该类,但是,这证明 Device Farm 确实读取了 testng.xml。

[更新]

当我在 testng.xml 中使用排除标记时,我能够重现该问题。 IE 当我使用这个 xml 时:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
    <test name="test">
        <classes>
            <class name="factory.TestSingleUrl">
                <methods>
                    <exclude name="testCorrectSiteKey" />
                    <exclude name="testIsTagImplemented" />
                    <exclude name="testHttpsScheme" />
                    <exclude name="testCorrectTagName" />
                    <exclude name="testCorrectBootstrapPath" />
                </methods>
            </class>
        </classes>
    </test>
</suite>

将进一步调查方法标签。

[更新]

看起来这是 Device Farm 中的一个已知问题: AWS Device farm seems to be ignoring TestNG annotations

猜想我们只需要等待他们更新他们的环境和解析器。

您也许可以在私人设备上运行测试。您需要联系 aws 以通过此电子邮件获取:

aws-devicefarm-support@amazon.com

[更新]

看起来他们已经更新了 webDriverAgent。看看现在能不能用。

希望对您有所帮助。

最好的问候

詹姆斯

【讨论】:

  • 我让它在本地设备上工作。问题是当我将它发送到 AWS Device Farm 时,他们不尊重 testng.xml 文件。
  • 设备场是否为您提供任何可以分享的解析结果或错误消息?
  • 他们给我的错误信息是“无法调用方法:要么使其成为静态,要么创建一个非参数构造函数”。那是因为他们试图从 TestSingleUrl 类运行 Test 方法,但他们的构造函数有参数,因为是实例化它们的工厂。所以这就是为什么我暗示他们忽略了 xml 文件
猜你喜欢
  • 1970-01-01
  • 2019-07-14
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2017-10-03
相关资源
最近更新 更多