2016-03-31 23 views
2

I (Selenyum testler için) paralel olarak benim testleri çalıştırmak için aşağıdaki kurulum var:MSTest'te test yürütme sırasında test dışı test yöntemini test olarak nasıl ekleyebilirim?

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

benim Jenkins sunucuda test sonucu rapor yalnızca bir test tükendi gösteriyor olsa da bu iyi çalışır. Raporda TestAllParallel() tarafından yürütülen tüm testleri görmek istiyorum.

bunu yapmak mümkün mü? Belki de çalışma zamanı sırasında MSTest'e bir test olarak bir yöntem eklemenin mümkün olacağını düşünüyorum.

+0

Ben mstest zamanında test eklemek için bir yöntem olduğunu düşünmüyorum nasıl görebiliriz. Testleriniz için ayrı bir trx dosyası yaratabilirsiniz (dosyayı metotlarınızda oluşturarak) ve ardından Jenkins'deki en hızlı eklenti, MSTest'den çıktı olduğunu düşünürdü. –

+0

Belki de test kodu için kod kapsamını kontrol etmeyi deneyebilirsiniz (test edilen kod yerine). Her ne kadar jenkins & mstest'de bunu yapacağımı bilmiyorum. –

+0

Neden tüm testlerinizi kendi başınıza yürütüyorsunuz ve Jenkins sunucunuzu sizin için yapmasını istemiyorsunuz? – silver

cevap

1

Ben bir yöntemi eklemek mümkün değildir korkuyorum ama bu belirli Testinde tüm işlemlere ait sonuçları rapor verebilir.

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

    } 

ilerleyen testAllParallel içinde

: bu sadece bir fikir değil

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

) 

unutmayın olduğunu sen çalıştırılmasının sonuçlarını kaydedebilmek için benzer bir şey ile test yöntemlerinin İlk sarma yürütme aşağıda kodlamak için tamamen çalışan kod. Özellikle .net'de ThreadSafeStringBuilder yoktur, bu yüzden muhtemelen kendi uygulamanızı veya bazı kütüphaneleri kullanmanız gerekir.

+0

Bu, hata günlüğünde birden çok hata toplayacak ve benim sorumu ele almasa da kurulumumda bir iyileştirme olacak. Ama sen ödülünü al! – Drutten

0

System.Diagnostics.WriteLine kullanarak, tıpkı iyi işe yarayabilecek başka sistem yoktur. Yazdıklarınız çıktı alır. Burada tartışılan başka bir soru var: Add custom message to unit test result

Bu ileti dizisinde çok ilginç bir nokta, bir durum mesajı olmadan birinin test içeriğini tümüyle kaldırarak "sabotaj" yapabilmesidir. yine de normal testlerde teşhis gönderin.

+0

Korkarım ki konsola yazmak, testi Jenkins'deki sonuç listesine eklemeyecek. – Drutten

0

Ben Sorunuzu doğru anlamış emin değilim ama bu aksilik üstesinden gelmek için çözüm biraz değiştirmek gerektiğini düşünüyorum. Sadece komut satırını çalıştıran bir projeyi Jenkins'de oluşturmaya çalışın, komut tüm testlerinizi MSTest komutuyla yürütmek olabilir. bunu here