2016-03-31 8 views
2

私は(Seleniumテスト用)並行して、私のテストを実行するには、次のセットアップを持っている:MSTestでテスト実行中に非テストメソッドをテストとして追加するにはどうすればよいですか?

[TestClass] 
public class ParallelTests 
{ 
    [TestMethod] 
    public void TestAllParallel() 
    { 
     var testActions = Assembly.GetExecutingAssembly().GetTypes() 
      .Where(t => 
       t.GetCustomAttribute<CompilerGeneratedAttribute>() == null && 
       t.GetCustomAttribute<TestClassAttribute>() != null) 
      .Select(t => new Action(() => RunTest(t))) 
      .ToArray(); 

     System.Threading.Tasks.Parallel.Invoke(testActions); 
    } 

    private static void RunTest(Type test) 
    { 
     var instance = Activator.CreateInstance(test); 

     ExecuteTestMethods(instance); 
    } 

    private static void ExecuteTestMethods(object instance) 
    { 
     var testMethods = instance.GetType().GetMethods() 
      .Where(m => 
       m.GetCustomAttribute<TestMethodAttribute>(false) != null && 
       m.GetCustomAttribute<IgnoreAttribute>(false) == null) 
      .ToArray(); 

     foreach (var methodInfo in testMethods) 
     { 
      methodInfo.Invoke(instance, null);; 
     } 
    } 
} 

私ジェンキンスサーバーでのテスト結果のレポートが一つだけのテストが実行されたことを示しているがこれは正常に動作します。報告書には、TestAllParallel()によって実行されたすべてのテストが表示されます。

これは可能ですか?私はおそらく、実行時にMSTestにテストとしてメソッドを追加することが可能であると考えています。

+0

私はmstestが実行時にテストを追加する方法がないと思います。テスト用の別のtrxファイルを作成して(メソッドにファイルを生成する)、JenkinsのmstestプラグインはMSTestから出力されたと考えられます。 –

+0

テストされているコードではなく、テストコード自体のコードカバレッジを確認しようとする可能性があります。私はジェンキンズ&mstestでそれを行う方法がわかりませんが。 –

+0

なぜあなた自身のテストをすべて実行し、ジェンキンスのサーバーにあなたのためのテストを指示していないのですか? – silver

答えて

1

メソッドを追加することはできませんが、その特定のテストのすべての実行結果を報告できます。あなたが実行の結果を保存することができますので、以下のコードのようなものと試験方法の最初のラップ実行:

private static void ExecuteMethod(MethodInfo method, object instance) 
    { 
     try 
     { 
      method.Invoke(instance, null); 
      threadSafeStringBuilder.Append("Test: " + method.Name + " passed"); 
     } 
     catch (UnitTestAssertException utException) 
     { 
      threadSafeStringBuilder.Append("Test: " + method.Name + " assertion failed" + utException.Message); 
      _allPassed = false; 
     } 
     catch (Exception ex) 
     { 
      threadSafeStringBuilder.Append("Test: " + method.Name + " exception: " + ex.Message"); 
     } 

    } 

後半testAllParallel中:

public void TestAllParallel() 
{ 
//... 
System.Threading.Tasks.Parallel.Invoke(testActions); 
if(_allPassed){ 
    Assert.IsTrue(true, "All tests Passed:\n"+threadSafeStringBuilder.ToString()); 
    }else{ 
    Assert.Fail("Some tests failed:\n"+threadSafeStringBuilder.ToString()); 
    } 

) 

、それだけの考えであることを覚えていない所に保管してください完全に動作するコード。特に.netにはThreadSafeStringBuilderがありません。おそらく自分で実装するか、いくつかのライブラリを使用する必要があります。

+0

これは、エラーログに複数の失敗を収集し、私の質問に対処していませんが、私のセットアップの改善です。しかし、あなたは恩恵を受ける! – Drutten

0

System.Diagnostics.WriteLineを使用すると、同様に機能するシステムがあります。あなたが書いたものを出力します。ここではそれを議論する別の質問です:Add custom message to unit test result

そのスレッドの非常に興味深い点は、誰かがテストの内容をすべて破棄してテストを "妨害"する可能性があるということです。とにかく通常のテストで診断を送ってください。

+0

コンソールに書き込むことは、Jenkinsの結果リストにテストを追加するのではないかと恐れています。 – Drutten

0

私はあなたの質問を正しく理解しているかどうかはわかりませんが、この後退を乗り越えるためには、ソリューションを少し変更する必要があると思います。 コマンドラインのみを実行するプロジェクトをJenkinsでビルドしようとすると、コマンドはMSTestコマンドですべてのテストを実行できます。 あなたはそれを行う方法を見ることができますhere