VS 2010 Test Çalıştırıcısı hatası "Test çalışırken aracı işlemi durduruldu."


101

Visual Studio 2010'da bir dizi birim testim var. Test listelerini kullanarak aynı anda birden fazla test çalıştırdığımda, bazen bir veya daha fazla test için aşağıdaki hatayı alıyorum:

Aracı işlemi, test çalışırken durduruldu.

Asla aynı test başarısız olmaz ve testi tekrar çalıştırmayı denersem başarılı olur.

Aynı sorun gibi görünen bu hata raporunu Connect'te buldum , ancak bir çözüm sunmuyor.

Bu davranışı gören başka biri var mı? Bundan nasıl kaçınabilirim?

Düzenle

Hala bu hatayı yaşıyorum ve meslektaşlarımın çoğu aynı yazılım / donanım kurulumunda. Şimdiye kadar cevapları değerlendirdim ama sorunu çözmüyorlar. Bu sorunun çözümü için bir ödül başlatıyorum.


Ben de aynı şeyi alıyorum. Araştırıyorum ama şu ana kadar çözüm yok
Mark

Bu konuda haber var mı? Aynı sorun burada ...
Peter Gfader

@Peter, aşağıdaki yorumuma bakın cevap kabul. Bu benim çözümümdü, ama probleminizin benzer olup olmadığını bilmiyorum.
driis

Yakalanmamış bir istisna ile aynı davranışa sahiptim. Derleme sunucusunda Visual Studio çalıştırdığımda ve bir Assert-Penceresi aldığımda istisna benim için görünürdü. İddia penceresi nedeniyle test devam edemedi.

Yanıtlar:


41

Az önce benzer problemi yaşadım: Bazı testler başarısız oluyor ve farklı test çalışmalarında farklılar. Bunun neden olduğunu tam olarak bilmiyorum, ancak derslerimden birine bir sonlandırıcı eklediğimde ortaya çıkmaya başladı. Sonlandırıcıyı devre dışı bıraktığımda - sorun ortadan kalkıyor. Sonlandırıcıyı açtığımda - sorun geri geliyor.

Şu anda bunun üstesinden nasıl geleceğimi bilmiyorum.


16
TEŞEKKÜRLER - bu cevap beni çözüme götürüyor. Sadece birkaç tipte bir sonlandırıcım var ve elbette, onları kaldırmak da sorunu ortadan kaldırdı. Daha fazla araştırmanın ardından, bir sonlandırıcıda, yalnızca kurucuda bir istisna atıldığında ortaya çıkan ince bir hata keşfettim ve sonlandırıcı, tam olarak inşa edilmemiş bir nesneyi sonlandırmaya çalıştı. Sonuç: Bir türdeki sonlandırıcıda bir istisna oluşursa ve bu sonlandırıcı tüm testler bitmeden çalışırsa, Visual Studio karşılaştığım hatayı verir; daha fazla açıklama yapılmadan ve rastgele testlerle.
driis

6
Kodumda sonlandırıcı / yıkıcı yok ... ~ Sınıfım () ve aynı hatayı al. Resharper ile yapılan testlerin hepsi yeşil
Peter Gfader

6
Sonlandırıcılarda yakalanmamış istisnalarla ilgili sorun, bazı testler tarafından başlatılabilen veya programlanabilen (belki dolaylı olarak) ve test tamamlanmış olsa bile uygulamaya devam edebilen arka plan görevlerinde yakalanmamış istisnaların özel bir durumudur.
satorg

1
Peter ile aynı, Resharper test koşucusu bana tamamen yeşil veriyor. VS 2010 test koşucusu, yıkıcı ile sınıfta başarısız oluyor.
RyBolt

1
Dispose () yöntemimde yanlışlıkla sonsuz özyinelemeli bir döngü kodladım ve bu da buna neden oldu.
Robert

88

Bu mesaj, test iş parçacığının yürütülmesinden farklı bir iş parçacığındaki istisnadan kaynaklanır . Şimdiye kadarki tüm cevaplar bu basit açıklamaya indirgenmiştir. Bu durumda herhangi bir mantıklı bilginin görüntülenmemesi, Visual Studio'da bilinen bir hatadır.

Visual Studio'nun test çalıştırıcısı, yürütülen test iş parçacığı dışındaki bir iş parçacığı bir istisna atarsa ​​tamamen tıkanır: Yutulur ve hiçbir çıktı, müdahale etme ve hata ayıklama şansı yoktur ve biriminiz olması gereken yanmış bir yanma karmaşası dışında hiçbir şey yoktur Ölçek.


Aynı şey benim için de oldu - testim ayrı bir iş parçacığı üretiyordu, bu da istisna oluyordu. İş parçacığının içindeki istisnayı yakalamak, en azından onu yazdırmama ve neler olduğunu bilmeme izin veriyor. Ancak Assert.Fail () öğesini iş parçacığının catch bloğuna koymamaya dikkat edin - bu sizi başladığınız yere geri götüren ayrı bir istisna yaratır.
Kyle Krull

4
benim için aynı şey, C # ile izlenmesi java'ya kıyasla çok daha zor olan yığın taşması dışında ...
John Gardner

Aslında, Thread nesnelerini kullanmaya başladığımda ve onları durdurmak için Abort () çağırdığımda bunun olduğunu fark ettim.
espaciomore

1
Bu async void, test sırasında çağrılan bir yöntem bir istisna attığında da olur
Mathias Becher

1
Trx'in hata bilgilerini içerebileceğini unutmayın, bunu bir metin düzenleyicide veya Visual Studio'da açıp Test Sonuçları penceresindeki Test çalıştırma hatası köprüsünü tıklatarak görebilirsiniz .
Ohad Schneider

16

Bu sorunu yaşıyordum ve Kodumda Test Çerçevesinin düzgün yakalamadığı bir sorun olduğu ortaya çıktı. Küçük bir kazara yeniden düzenleme bende şu kodu bırakmıştı:

public void GetThingy()
{
    this.GetThingy();
}

Bu elbette sonsuz bir özyinelemedir ve bir StackOverflowException'a (sanırım) neden oldu. Bunun neden olduğu şey korkunçtu: "Test çalışırken aracı işlemi durduruldu."

Hızlı bir kod incelemesi bana sorunu gösterdi ve testlerim şimdi iyi gidiyor. Umarım bu yardımcı olur - sorunları arayan kodu incelemeye değer olabilir veya belki bir konsol uygulamasına biraz ayıklayıp orada düzgün çalıştığını kontrol etmeye değer.


3
Sorun bu değil (biliyorum çünkü her seferinde başarısız olan farklı testler), ancak zaman ayırıp cevaplamaya zaman ayırdığınız için teşekkür ederim.
driis

6
+1, çünkü bu sorun için birçok geçerli cevaptan biri. sınıflarımdan birindeki sstatic yöntemindeki bir SO istisnası bu soruna neden oldu.
Peter T. LaComb Jr.

6
+1, bunu ben de gördüm. Testin hata ayıklaması (VS 11'de) sorunu oldukça hızlı bulur.
Jeremy McGee

Jeremy ile aynı fikirde. Birim testlerinde hata ayıkladığınızda, istisnanın atıldığı yerde durması gerekir. Bununla birlikte, sadece birim testlerini çalıştırırsanız, hepsi yeşil ışıklarla gelecektir. Çok tuhaf.
Andrew Stephens

8

Sorunumun kaynağını test sonuç dosyasına (/TestResults/*.trx) bakarak bulabildim. Arka planda meydana gelen istisnanın tüm ayrıntılarını sağladı ve bu istisnayı çözdüğümde "aracı işlendi durdu ... "hatası gitti.

Benim durumumda, GUI'yi birim testimde istemeden başlatıyordum ve bu da sonunda bir System.ComponentModel.InvalidAsynchronousStateException oluşmasına neden oldu.

Yani .trx dosyam şunları içeriyordu:

   <RunInfo computerName="DT-1202" outcome="Error" timestamp="2013-07-29T13:52:11.2647907-04:00">
    <Text>One of the background threads threw exception: 
System.ComponentModel.InvalidAsynchronousStateException: An error occurred invoking the method.  The destination thread no longer exists.
at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
at System.Windows.Forms.Control.Invoke(Delegate method)
...
</Text>
  </RunInfo>

Bu, hataya hangi testin neden olduğu hakkında herhangi bir bilgi sağlamadı, ancak bana istisnanın nerede olduğunu gösterdi, bu çok yararlıydı.


5

Test süreci çöküyor ve bir arka plan iş parçacığı üzerinde işlenmeyen bir özel durum olduğunda meydana gelebilir Bu ileti genellikle oluşturulur, yığın taşması olur, ya için açık çağrı Process.GetCurrentProcess().Kill()veya Environment.Exit. Diğer bir olası neden, yönetilmeyen koddaki erişim ihlalidir.

Hiç kimsenin bahsetmediği bir şey, olay günlüğünde ek bilgi olabileceğidir. Genellikle testin sonuçlarda neden çöktüğü hakkında çok fazla bilgi almazsınız, ancak bir arka plan iş parçacığında işlenmeyen bir istisna olması durumunda, test çerçevesi ayrıntıları VSTTExecution kaynağıyla Uygulama olay günlüğüne yazar. Olay günlüğüne hiçbir bilgi yazılmamışsa, bu muhtemelen yukarıda listelenen diğer nedenlerden biridir.


4

Benim durumumda çözüm Çıktı Penceresini kontrol ederek çözüldü .

'QTAgent32.exe' (Yönetilen (v4.0.30319)): Yüklendi 'C: \ TestResults \ bdewey_XXXXXX072 2011-01-11 17_00_40 \ Out \ MyCode.dll', Semboller yüklendi. E, 9024, 9, 2011/01/11, 17: 00: 46.827, XXXXX072 \ QTAgent32.exe, İşlenmemiş İstisna Yakalandı, Watson aracılığıyla raporlama: [İstisna mesajı]

Benim durumumda, ayrı bir iş parçacığına bir hata atan bir FileSystemWatcher vardı.


Bunu nasıl çözdün? M $ 'dan FileSystemWatcher'ı bir hizmete saran ve bunun etrafında bir WF iş akışı oluşturan bazı örnek kod kullanıyorum. Bunlardan bir sürü alıyorum ...
ekkis

Benim durumumda iki test başarısız oldu. Ben gittiğimde Çıktı bölmesinde ve seçtik Testleri , bu ... "istisna attı plan iş parçacığı biri" sözü aslında, 9 NullReferenceExceptions yığın izleri beni bekliyorlardı. Teşekkürler, bu çok yardımcı oldu!
Qwertie

3

Aynı Sorunla karşılaştım ve Kaldırırken çözdüm

Environment.Exit(0);

Bu nedenle, testiniz veya test edilen yönteminiz yürütme işleminin sona ermesine neden olurken bu hatanın meydana geldiğinden oldukça eminim.


2

Soruyu gönderdiğiniz için teşekkürler. Bu problemle karşılaştım ve karşılaşabileceğin bir sebep buldum.

Eşzamansız bir istisna meydana gelmiş olabilir

Test kurulumum sırasında, iş parçacığı havuzunda bir çalışan iş parçacığını kuyruğa alan bir nesne oluşturuyorum. Hata ayıklamayı yeterince hızlı çalıştırırsam kodum geçer.

Çalışan iş parçacığı başlar ve test kurulumu tamamlanmadan ÖNCE bir hata oluşursa, herhangi bir gerekçe olmaksızın Durduruldu sonucunu alırım.

Çalışan iş parçacığı test başladıktan SONRA başlar ve bir hata oluşursa, şu sonucu alırım: Hata - Test çalışırken aracı işlemi durduruldu.

Unutulmaması gereken önemli: bu, birkaç testimde kullandığım bir bileşendir. Test çerçevesi bu hataların çok çoğuyla karşılaşırsa, testlerin geri kalanını iptal eder.

Bu yardımcı olur umarım


Cevap için teşekkür ederim. Eşzamansız istisnaların gördüklerime benzer bir şeye neden olabileceğinin farkındayım, ancak durumun böyle olmadığından neredeyse eminim. Kod bir web uygulaması içindir ve eşzamansız olarak hiçbir şey yapmayız. Ayrıca, hangi testin başarısız olduğu rastgele görünüyor.
driis

2

Testlerime dahil olan herhangi bir sınıfta tanımlanan ~ ClassName () {} descructor'a dene / yakala blokları ekledim. Bu benim için sorunu çözdü.

~MyClass()
{
    try
    {
        // Some Code
    }
    catch (Exception e)
    {
        // Log the exception so it's not totally hidden
        // Console.WriteLine(e.ToString());
    }
}

2

İstisnanın nereye atıldığını bulmak için Test Sonuçları penceresindeki ünlem simgesinin yanındaki "Test Çalıştırma Hatası" hiperlinkini tıklayın. Yığın izlemeli bir pencere açılır.

Bu, hatayı bulmaya çok yardımcı olur!


1

Aynı sorunu yaşadım ve yönetilmeyen bir kaynak için bir sonlandırıcıdan kaynaklanıyordu (herhangi bir nedenle düzgün bir şekilde atılmayan bir dosya yazıcısı).

Sonlandırıcı kodunu istisnayı yutan bir dene-yakalamaya sardıktan sonra sorun ortadan kalktı. Bunun gibi istisnaları yutmayı önermiyorum, bu yüzden istisnanın neden ilk başta meydana geldiğini öğrenmek açıkça akıllıca olacaktır.


1

Bunu tuhaf bir durumda yaşadım ve suçlu neredeyse her zaman iş parçacığı oluyor.

Gariptir ki, tüm testler geliştirme makinelerinde iyi sonuç verir ve ardından derleme sunucularında rastgele başarısız olur.

Daha yakından incelendiğinde, testlerin geliştirici kutularında geçti olarak listelenmiş olmasına rağmen, atılan istisnalar olduğu ortaya çıktı. İstisnalar, hata olarak algılanmayan ayrı bir konuya atılıyordu.

İstisna ayrıntıları test izine göre günlüğe kaydediliyordu, bu nedenle hangi kodun / testlerin değiştirilmesi gerektiğini belirleyebildik.

Umarım bu birine yardımcı olur.


0

Benim durumumda bir WCF hizmeti için bazı birim testlerim vardı. Bu WCF hizmeti 2 zamanlayıcı başlatıyordu.
Bu zamanlayıcılar yan etkilere neden oldu.
-> Bu zamanlayıcıları varsayılan olarak devre dışı bırakıyorum ve her şey yolunda!

BTW: WCF hizmetini taklit etmek için WCFMock kullanıyorum , bu nedenle WCF hizmetim etrafında "gerçek" birim testlerim var


0

Bu hata benim için de bir Sonlandırıcıdan kaynaklandı.
Sonlandırıcı aslında alay edilmeyen bazı DB kodunu çağırıyordu. Onu bulmam biraz zaman aldı çünkü yazdığım bir sınıf değildi ve referansı epeyce derine gömülmüştü.


0

TestInitialize'da bir testin başarısız olduğu ve ayrıca projelerimden birinden bir ddl'den kod çalıştırdığı benzer bir sorunla karşılaştım. Hata mesajını yukarıda açıklandığı gibi alıyorum ve testte hata ayıklamaya çalışırsam, herhangi bir istisna detayı olmadan test iptal ediliyor.

Sorunun, diğer projemdeki dll'lerin bir Visual Studio 2012 projesinden olmasından ve testlerimi bir VS2010 projesinde çalıştırıyorum ve / veya muhtemelen 2 projeden UnitTestFramwork dll sürümlerinin uyumsuz olmasından kaynaklanabileceğinden şüpheleniyorum.


0

Sorun, bir TestClass Oluşturucusunda bir İstisna veya Stackoverflow tarafından da tetiklenebilir.


0

Bu hatanın birçok farklı nedeni olabileceğinden, bu iş parçacığının eksiksiz olması için bir tane daha eklemek istiyorum.

Eğer tüm Testlerinizi edilen OP tarafından tarif iptal ediyoruz, çünkü yanlış bir proje yapılandırması olabilir. Benim durumumda, hedef çerçeve .NET Framework 3.5 olarak ayarlandı. Proje özellikleri sayfası ( Uygulama sekmesi ) aracılığıyla daha yüksek bir sürüme ayarlanması sorunu çözdü.


0

Windows Olay Görüntüleyicisi'ndeki Windows Günlükleri > Uygulama günlüğü girişlerine bakarak sorunuma neyin neden olduğunu belirleyebildim . Testin bombalandığı andaki girişleri arayın. Aşağıdakine benzer bir Hata girdim vardı :

QTAgent32_40.exe, PID 10432, Thread 2) AgentProcess:CurrentDomain_UnhandledException: IsTerminating : System.NullReferenceException: Object reference not set to an instance of an object.
   at XXX.YYY.ZZZ.cs:line 660
   at XXX.YYY.AAA.Finalize() in C:\JenkinsSlave\workspace\XXX.YYY.AAA.cs:line 180

Gerçekten de, bir sınıf sonlandırıcısından çağrılan bir yöntem içindeki boş bir referans istisnasıydı.


0

Bu eski soruyu soran ve başlıklarından ne atıldığını merak edenler için işte bir ipucu. Task.Run kullanmak (diyelim, Thread.Start'ın aksine), çocuk iş parçacığı istisnalarını çok daha güvenilir bir şekilde rapor edecektir. Kısacası bunun yerine:

Thread t = new Thread(FunctionThatThrows);
t.Start();
t.Join();

Bunu yap:

Task t = Task.Run(() => FunctionThatThrows());
t.Wait();

Ve hata günlükleriniz çok daha kullanışlı olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.