Testng XML未被AWS设备农场接受

问题描述:

我正在尝试使用testng.xml ...并且看起来像设备农场忽略了整个文件。Testng XML未被AWS设备农场接受

我的例子很简单。我有一个工厂类,实例化测试类,这是我的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> 

但我发现了一个“无法调用方法:使其成为静态或创建非参数构造函数“。这意味着设备场正在尝试运行TestSingleUrl类中的方法..但是呼叫这些测试的人应该是工厂

有谁知道我们如何让设备场接受我们的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

+0

你能分享生产和TestSingleUrl?看起来你错误地实现了Factory模式。 – RocketRaccoon

+0

嘿@RocketRaccoon,我只是把类。我不认为是在我的类错误..因为我可以在本地设备运行它..问题是当我把它发送到设备农场。 –

+0

你在那里执行它? – RocketRaccoon

我不知道确切,但我相信你应该能够放置的testng.xml在资源目录,并从pom.xml中引用它。

貌似这篇文章介绍如何从pom.xml中引用的testng.xml: How to call testng.xml file from pom.xml in Maven

当您生成项目,然后它会被包含在瓶子里。

的awslabs项目通过使用该MVN命令构建它

MVN清洁套装-DskipTests =真

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

[更新] 我从awslabs下载的示例项目并将其导入蚀。 我加入这个插件到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>  

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

我复制并粘贴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 

,因为我没有在我的类路径类,这是预期,然而,这证明了设备农场没有阅读的testng.xml。

[更新]

我能够重现问题时,我用排除标签中的testng.xml。 I.E当我使用这个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> 

要进一步调查方法标签。

[更新]

看起来这是在设备农场的已知问题: AWS Device farm seems to be ignoring TestNG annotations

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

您可能可以在私有设备上运行测试。你将需要联系AWS获得一个在此电子邮件:

[email protected]

[更新]

看起来他们已经更新了webDriverAgent。看看它现在是否有效。

希望有所帮助。

问候

詹姆斯

+0

我使它在本地设备上工作。问题是,当我将它发送到AWS Device Farm时,他们不尊重testng.xml文件。 –

+0

设备场是否为您提供可以共享的任何分析结果或错误消息? – jmp

+0

他们给我的错误信息是“无法调用方法:使其成为静态或创建非参数构造函数”。那是因为他们试图从TestSingleUrl类运行Test方法,但是他们的构造函数有参数,因为是实例化它们的工厂。所以这就是为什么我暗示他们忽略了xml文件 –