2017-08-02 3 views
1

J'essaie d'utiliser le fichier testng.xml ... et on dirait que Device Farm ignore le fichier entier.Testng XML non accepté par AWS Device Farm

Mon exemple est simple. J'ai une classe d'usine qui instancier les classes de test, ce qui est la façon dont mon fichier xml ressemble

<?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> 

J'ai même essayé d'exclure les méthodes manuellement

<?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> 

Mais je reçois un « Can not invoke method: soit le rendre statique soit créer un constructeur non-args ". Ce qui signifie que la Ferme des Périphériques essaye d'exécuter les méthodes de TestSingleUrl Class..Mais celui qui appelle ces tests devrait être l'usine

Est-ce que quelqu'un sait comment faire pour que la Ferme des Périphériques accepte notre fichier xml?

Ceci est mon Classe usine:

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)}; 
     } 
    } 
} 

Et voici ma TestSingleUrl Classe:

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")); 
    } 
} 

Je pense que les messages d'erreur que je reçois est parce que la ferme de l'appareil tente d'exécuter chaque méthode avec une annotation @Test qu'elle trouve. S'il lisait mon fichier xml, cela n'arriverait pas.

RocketRaccoon

+0

Pouvez-vous partager l'usine et TestSingleUrl? On dirait que vous avez incorrectement mis en œuvre le motif d'usine. – RocketRaccoon

+0

Hey @RocketRaccoon, je viens de mettre les classes. Je ne pense pas que ce soit une erreur dans mes classes .. parce que je peux l'exécuter dans un périphérique local .. le problème est quand je l'envoie à la batterie de périphériques. –

+0

Et comment l'exécutez-vous là? – RocketRaccoon

Répondre

0

Je ne sais pas exactement, mais je crois que vous devriez être en mesure de placer le testng.xml dans un répertoire de ressources et de référence à partir du pom.xml.

On dirait que ce post montre comment référencer la testng.xml du pom.xml: How to call testng.xml file from pom.xml in Maven

Lorsque vous construisez le projet, alors il sera inclus dans le pot.

Le projet awslabs construit en utilisant cette commande mvn

package mvn clean -DskipTests = true

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

[Mise à jour] J'ai téléchargé l'exemple de projet de awslabs et importé dans Eclipse . J'ai ensuite ajouté ce plugin dans le fichier 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>  

J'ai ensuite créé le testng.xml dans ./src/test/resources/

Je copié et collé le code XML fourni ici:

<?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> 

I puis construit le projet en utilisant

mvn clean package -DskipTests=true 

Ceci a produit un fichier zip-with-dependencies.zip dans le répertoire cible.

J'ai téléchargé ce package de test vers la batterie de périphériques en créant un nouveau projet et en sélectionnant Appium Java Testng comme type de tests que je souhaite exécuter.

cette erreur j'ai rencontré parse:

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

Ce qui est attendu puisque je ne l'ai pas classe dans mon classpath, cependant, cela prouve que l'appareil agricole a lu le testng.xml.

[mise à jour]

Je suis en mesure de reproduire le problème quand j'utiliser la balise exclure dans le testng.xml. I.E quand j'utilise ce 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> 

Va chercher plus loin sur les étiquettes de méthode.

[mise à jour]

On dirait que cela est un problème connu dans Farm Device: AWS Device farm seems to be ignoring TestNG annotations

Devinez nous juste besoin d'attendre pour eux de mettre à jour leur environnement et l'analyseur.

Vous pourriez exécuter vos tests sur un appareil privé. Vous devrez contacter aws pour obtenir un à cet e-mail:

[email protected]

[Mise à jour]

On dirait qu'ils ont mis à jour le webDriverAgent. Voyez si cela fonctionne maintenant.

Espérons que ça aide.

Cordialement

James

+0

Je l'ai fait fonctionner sur un périphérique local. Le problème est lorsque je l'envoie à AWS Device Farm, ils ne respectent pas le fichier testng.xml. –

+0

La batterie de périphériques vous fournit-elle des résultats d'analyse ou des messages d'erreur que vous pouvez partager? – jmp

+0

Le message d'erreur qu'ils me donnent est "Impossible d'invoquer la méthode: soit la rendre statique ou créer un constructeur non-args". C'est parce qu'ils essaient d'exécuter les méthodes de test à partir de la classe TestSingleUrl, mais leurs constructeurs ont des arguments parce que c'est l'usine qui les instancie. Voilà pourquoi j'ai laissé entendre qu'ils ignorent le fichier xml –