0

次のtestng.xmlがあります

<test name="CommonReportingTests" preserve-order="true">
<classes>
   <class name="com.blah.ReportRunTests">
        <methods>
            <include name="login" />
            <include name="checkHomeTab" />
            <include name="checkReportsTab" />
             <include name="checkReportsExist" />
             <include name="reportsCleanup" />               
        </methods>
   </class>

   <class name="com.blah.RestoreActivityTests">
        <methods>
            <include name="login" />
            <include name="checkHomeTab" />
            <include name="checkReportsTab" />
             <include name="checkReportsExist" />             
             <include name="expandReportsTabAndClickRestoreActivity" />    
        </methods>
   </class>
</classes>

私の TestBase クラスにはこれがあります:

    @Parameters({ "webconsoleStartupURL" })
@BeforeSuite(description = "Perform class setup tasks")
public void beforeClass(final String webconsoleStartupURL)
        throws ClassNotFoundException, InstantiationException,
        IllegalAccessException {
    sm = new SeleniumMgr(webconsoleStartupURL);
    sm.startSelenium();
}

@AfterSuite(description = "Perform class teardown tasks")
public void afterClass() {
    sm.stopSelenium();
}

テストを実行すると、xml の 2 番目のテスト、つまり RestoreActivityTests のみが実行されたように見え、スイートを終了します。最初のクラスは実行されず、最初の各テストで NullPointerException が表示されます。

ブラウザーのインスタンスを 1 つだけにして、複数のテストを実行します。testng doc は、上記で使用した xml バージョンが実際には正しいことを示唆しています。ここで何が問題なのですか?

4

2 に答える 2

4

@BeforeSuite で同様の問題があり、xml を使用してテストを定義しました。xml ファイル内のすべてのテストの null ポインターですが、最後のものです。TestNG はリフレクションを使用して、テストを実行するために必要なクラスを作成しています。私の場合、xml ファイルから、xml の「テスト」ごとに反射的に新しいオブジェクトを作成します。2 つのクラスがあるシナリオでも同じことが考えられます。 . 最初のものでは、最初のテストで sm が初期化されていないため (したがって、null ポインターを取得します)、2 番目のテストのインスタンスで初期化が発生したため、null ポインターが発生します。

私の解決策は、参照を静的にすることでした(あなたの場合、protected static SeleniumMngr sm;

言い換えると、@BeforeTest または @BeforeClass を使用する必要はありません (sm オブジェクトをインスタンス化し続けるため、いずれにせよ希望どおりには機能しません)。

于 2012-10-04T20:45:16.173 に答える
1

各クラスを実行する前にメソッドを実行する必要がある場合は@BeforeClass @BeforeSuite、スイートがトリガーされる前に一度だけ実行する必要があります。

于 2011-06-27T20:22:59.957 に答える