2017-08-02 10 views
1

私はtestng.xmlを使用しようとしていますが、Device Farmがファイル全体を無視しているようです。Testng XMLがAWS 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> 

方法を除外しようとしたしかし、私は「することはできませんを取得していますメソッドを呼び出す:静的にするか、非argsコンストラクターを作成する "つまり、Device FarmがTestSingleUrl Classからメソッドを実行しようとしています。しかし、これらのテストを呼び出す人は工場でなければなりません。

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を共有してもらえますか?ファクトリパターンが正しく実装されていないようです。 – RocketRaccoon

+0

ちょっと@RocketRaccoon、私はクラスを置く。私はクラス内のエラーではないと思います。私はローカルデバイスで実行できます。問題は、デバイスファームに送信するときです。 –

+0

そして、どうやってそれを実行していますか? – RocketRaccoon

答えて

0

私は正確にはわからないが、私はあなたがresourcesディレクトリにtestng.xmlを置き、のpom.xmlからそれを参照することができるはずと信じています。

はこのポストのように見えるのpom.xmlからtestng.xmlを参照する方法を示しています How to call testng.xml file from pom.xml in Maven

あなたはそれはjarファイルに含まれるプロジェクトをビルドします。

awslabsプロジェクトは、このMVNコマンドを使用して構築する

MVNきれいなパッケージ-DskipTests =真の[更新] 私はawslabsからサンプルプロジェクトをダウンロードして日食にインポートし

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

。 私は、pom.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をコピーして貼り付け./src/test/resources/

でtestng.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>  

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で除外するタグを使用する場合、問題を再現することができています。私がこのxmlを使用したときに:

さらにメソッドタグについて調べる予定です。これは、デバイスのファームの既知の問題であるように

[更新]

はルックス: AWS Device farm seems to be ignoring TestNG annotations

は、我々はちょうど彼らの環境とパーサを更新するのを待つ必要があります推測します。

プライベートデバイスでテストを実行することができます。あなたはこのメールでは1を取得するためにAWSに連絡する必要があります

[email protected]

彼らはwebDriverAgentを更新したように、[更新]

が見えます。それが今働くかどうか見てください。

希望に役立ちます。

よろしく

ジェームズ

+0

私はそれをローカルデバイス上で動作させました。問題は、AWS Device Farmに送信するときに、testng.xmlファイルを尊重しないことです。 –

+0

デバイスファームは、解析結果やエラーメッセージを共有できますか? – jmp

+0

彼らが私に与えているエラーメッセージは、 "メソッドを呼び出せません:静的にするか、非argsコンストラクターを作成する"です。これは、TestSingleUrlクラスからTestメソッドを実行しようとしているが、それらのインスタンスを生成するファクトリがあるため、そのコンストラクタに引数があるからです。だからこそ、私は彼らがxmlファイルを無視していることを暗示しています。 –

関連する問題