1

インストルメンテーション テストが実行される順序、つまり ActivityInstrumentationTestCase2 を拡張する順序をランダム化できるかどうか疑問に思っています。このブログ投稿に従ってみましたが、テスト ランナーを使用したいことをテスト フレームワークに伝える方法がわかりません。

問題は、@RunWith アノテーションを使用できないことです。これらは (私が理解しているように) JUnit4 ではなく JUnit3 テストであるためです。

ランダム化する必要がないため、これが無意味である可能性は十分にありますが、この方法でテストの独立性を証明できればよいでしょう。

理想的には、コマンド ラインと gradle ラッパーを使用して最初に実行したいと思います。

それなら、できればAndroid Studioで動かせるといいですね。

[編集]

「Edit Configurations . . .」を実行すると、それがわかります。AS では、「特定のインストルメンテーション ランナー (オプション)」ボックスを使用して、そこで独自のランナーを指定することができます。残念ながら、それを行うと、次のエラーが発生します。

Test running startedTest running failed: Unable to find instrumentation info for: ComponentInfo{<path_to_class_here>.RandomizingTestRunner}
Empty test suite.

そして、私はその理由を理解できません。

4

1 に答える 1

1

次のランダム化されたランナーを使用できます。

package com.example.test.runners;

import android.test.InstrumentationTestRunner;
import android.test.suitebuilder.TestSuiteBuilder;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class RandomizedInstrumentationTestRunner extends InstrumentationTestRunner {

 @Override
 public TestSuite getTestSuite() {
    return buildTestSuite();
 }

 private TestSuite buildTestSuite() {
    TestSuiteBuilder builder = new TestSuiteBuilder(getClass().getName(), getTargetContext().getClassLoader());
    builder.includePackages("");

    List<Test> tests = new ArrayList<Test>();
    addTestsFromSuite(builder.build(), tests);
    Collections.shuffle(tests);

    TestSuite randomizedSuite = new TestSuite();
    for (Test one : tests) {
        randomizedSuite.addTest(one);
    }

    return randomizedSuite;
 }


 private void addTestsFromSuite(TestSuite suite, List<Test> out) {
    List<Test> tests = Collections.list(suite.tests());
    for (Test one : tests) {
        if (one instanceof TestSuite) {
                 addTestsFromSuite((TestSuite) one, out);
             }
             else{
                 out.add(one);
             }
        }
  }
}

build.gradleファイルにランナーを設定することを忘れないでください。

android {

   defaultConfig {
       testInstrumentationRunner "com.example.test.runners.RandomizedInstrumentationTestRunner"
       minSdkVersion 8
   }

   ....
}

最後に、以下を 2 回実行して、ランダムな実行順序を確認します。

./gradlew connectedCheck --info
于 2013-12-10T09:50:53.763 に答える