VS 2010 Test Runner error "Proses agen dihentikan saat pengujian sedang berjalan".

101

Dalam Visual Studio 2010, saya memiliki sejumlah tes unit. Ketika saya menjalankan beberapa tes sekaligus menggunakan daftar tes, terkadang saya menemukan kesalahan berikut untuk satu atau lebih tes:

Proses agen dihentikan saat tes sedang berjalan.

Ini tidak pernah sama dengan tes yang gagal, dan jika saya mencoba menjalankan tes lagi, itu berhasil.

Saya menemukan laporan bug ini di Connect , yang tampaknya merupakan masalah yang sama, tetapi tidak menawarkan solusi.

Apakah ada orang lain yang pernah melihat perilaku ini? Bagaimana saya bisa menghindarinya?

Edit

Saya masih mengalami bug ini, begitu pula banyak rekan saya yang menggunakan perangkat lunak / perangkat keras yang sama. Saya telah mengevaluasi jawaban sejauh ini, tetapi mereka tidak menyelesaikan masalah. Saya memulai hadiah untuk solusi untuk masalah ini.

driis
sumber
Saya mendapatkan hal yang sama. Saya sedang menggali ke dalamnya tetapi sejauh ini tidak ada solusi
Tandai
Ada berita tentang ini? Masalah yang sama di sini ...
Peter Gfader
@ Peter, lihat komentar saya di bawah jawaban yang diterima. Itu adalah solusi saya, tetapi saya tidak tahu apakah masalah Anda serupa.
driis
Saya memiliki perilaku yang sama dengan pengecualian yang tidak tertangkap. Pengecualian terlihat bagi saya ketika saya menjalankan Visual Studio di server build dan mendapat jendela Assert. Karena jendela assert, pengujian tidak dapat dilanjutkan.

Jawaban:

41

Saya baru saja mengalami masalah yang sama: beberapa pengujian gagal dan berbeda dalam pengujian yang berbeda. Saya tidak tahu persis alasan mengapa itu terjadi, tetapi itu mulai terjadi ketika saya menambahkan finalizer ke salah satu kelas saya. Ketika saya menonaktifkan finalizer - masalah hilang. Ketika saya mengaktifkan finalizer - masalahnya kembali.

Saat ini saya tidak tahu bagaimana mengatasinya.

satorg
sumber
16
TERIMA KASIH - jawaban ini menuntun saya ke solusi. Saya hanya memiliki finalizer pada beberapa jenis, dan tentu saja, menghapusnya juga menghilangkan masalah. Setelah penyelidikan lebih lanjut, saya menemukan bug halus dalam satu finalizer, yang terjadi hanya ketika pengecualian dilemparkan ke konstruktor, dan finalizer mencoba menyelesaikan objek yang tidak sepenuhnya dibangun. Kesimpulan: Jika pengecualian terjadi pada finalizer pada tipe, dan finalizer berjalan sebelum semua tes selesai, Visual Studio akan memberikan kesalahan yang saya hadapi; tanpa penjelasan lebih lanjut, dan pada tes acak.
driis
6
Saya tidak memiliki finalizer / destruktor dalam kode saya ... ~ MyClass () dan mendapatkan kesalahan yang sama. Menjalankan tes dengan Resharper semuanya hijau
Peter Gfader
6
Masalah dengan pengecualian yang tidak tertangkap di finalisator adalah kasus khusus pengecualian yang tidak tertangkap dalam tugas latar belakang yang dapat dimulai atau dijadwalkan (mungkin secara implisit) oleh beberapa pengujian dan dapat terus dijalankan meskipun pengujian telah selesai.
satorg
1
Sama seperti Peter, pelari tes Resharper memberi saya semua hijau. Pelari pengujian VS 2010 gagal di kelas dengan destruktor.
RyBolt
1
Saya secara tidak sengaja mengkodekan loop rekursif tak terbatas dalam metode Dispose () saya, yang juga menyebabkan ini.
Robert
88

Pesan ini disebabkan oleh pengecualian pada utas yang berbeda dari utas percobaan yang sedang menjalankan . Semua jawaban sejauh ini bermuara pada penjelasan sederhana ini. Ini adalah bug yang diketahui dalam Visual Studio untuk tidak menampilkan informasi yang masuk akal dalam kasus itu.

Pelari pengujian Visual Studio benar-benar tersedak jika utas selain utas pengujian yang sedang dijalankan mengeluarkan pengecualian: Itu tertelan dan tidak ada output, tidak ada kesempatan untuk mencegat dan men-debug dan tidak ada apa-apa kecuali kekacauan membara yang terbakar yang seharusnya menjadi unit Anda uji.

mafu
sumber
Hal yang sama terjadi pada saya juga - pengujian saya menghasilkan utas terpisah, yang mendapatkan pengecualian. Menangkap pengecualian di dalam utas setidaknya memungkinkan saya untuk mencetaknya dan mengetahui apa yang terjadi. Namun berhati-hatilah untuk tidak menempatkan Assert.Fail () di blok tangkapan utas - yang menimbulkan pengecualian terpisah yang menempatkan Anda kembali ke tempat Anda memulai.
Kyle Krull
4
hal yang sama bagi saya, kecuali tumpukan overflow, yang jauh lebih sulit dilacak di C # dibandingkan dengan java ...
John Gardner
Memang, saya perhatikan ini terjadi ketika saya mulai menggunakan objek Thread dan memanggil Abort () untuk menghentikannya.
espaciomore
1
Ini juga terjadi ketika async voidmetode yang dipanggil selama pengujian melontarkan pengecualian
Mathias Becher
1
Perhatikan bahwa trx mungkin berisi informasi kesalahan, Anda dapat melihatnya dengan membukanya di editor teks, atau di Visual Studio dan mengklik hyperlink Kesalahan proses di jendela Hasil Tes .
Ohad Schneider
16

Saya mengalami masalah ini, dan ternyata ada masalah dalam kode saya yang Kerangka Uji tidak menangkap dengan benar. Sedikit pemfaktoran ulang yang tidak disengaja telah meninggalkan saya dengan kode ini:

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

Ini tentu saja merupakan rekursi tak terbatas, dan menyebabkan StackOverflowException (saya kira). Penyebabnya adalah hal yang ditakuti: "Proses agen dihentikan saat pengujian sedang berjalan."

Pemeriksaan kode cepat menunjukkan masalahnya, dan pengujian saya sekarang berjalan dengan baik. Semoga ini bisa membantu - mungkin perlu memeriksa kode untuk mencari masalah, atau mungkin mengekstrak sedikit ke dalam aplikasi konsol dan memeriksanya berfungsi dengan baik di sana.

Simon Steele
sumber
3
Ini bukan masalahnya (saya tahu karena ini adalah tes berbeda yang gagal setiap kali), tapi terima kasih telah meluangkan waktu untuk menjawab.
driis
6
+1 karena ini adalah salah satu dari banyak jawaban yang valid untuk masalah ini. pengecualian SO dalam metode sstatic di salah satu kelas saya menyebabkan masalah ini.
Peter T. LaComb Jr.
6
+1, Saya telah melihat ini juga. Debugging tes (di VS 11) menemukan masalahnya cukup cepat.
Jeremy McGee
Setuju dengan Jeremy. Jika Anda men-debug pengujian unit maka itu harus berhenti di mana pengecualian dilemparkan. Namun jika Anda hanya menjalankan pengujian unit, semuanya akan menghasilkan lampu hijau. Sangat aneh.
Andrew Stephens
8

Saya dapat menemukan sumber masalah saya dengan melihat di file hasil pengujian (/TestResults/*.trx) Ini memberikan detail lengkap tentang pengecualian yang terjadi di utas latar belakang, dan setelah saya menyelesaikan pengecualian itu, "agen diproses berhenti ... "kesalahan hilang.

Dalam kasus saya, saya secara tidak sengaja meluncurkan GUI dalam pengujian unit saya, yang akhirnya menyebabkan System.ComponentModel.InvalidAsynchronousStateException dilempar.

Jadi file .trx saya berisi:

   <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>

Ini tidak memberikan informasi apa pun tentang tes apa yang menyebabkan kesalahan, tetapi itu menunjukkan kepada saya di mana pengecualian itu, yang sangat berguna.

Denise Skidmore
sumber
5

Pesan ini biasanya dibuat ketika proses pengujian mengalami crash dan bisa terjadi ketika ada pengecualian yang tidak tertangani pada thread latar belakang, terjadi stack overflow, atau panggilan eksplisit ke Process.GetCurrentProcess().Kill()atau Environment.Exit. Kemungkinan penyebab lainnya adalah pelanggaran akses dalam kode yang tidak dikelola.

Sesuatu yang tidak disebutkan oleh siapa pun adalah bahwa mungkin ada informasi tambahan di log peristiwa. Biasanya Anda tidak akan mendapatkan banyak informasi tentang mengapa tes gagal dalam hasil, namun jika terjadi pengecualian yang tidak tertangani pada utas latar belakang, kerangka kerja pengujian menulis detail ke log kejadian Aplikasi dengan sumber VSTTExecution. Jika tidak ada informasi yang ditulis ke log peristiwa, kemungkinan besar itu adalah salah satu penyebab lain yang tercantum di atas.

Mike Zboray
sumber
4

Dalam kasus saya, solusinya diselesaikan dengan memeriksa Output Window .

'QTAgent32.exe' (Dikelola (v4.0.30319)): Dimuat 'C: \ TestResults \ bdewey_XXXXXX072 2011-01-11 17_00_40 \ Out \ MyCode.dll', Simbol dimuat. E, 9024, 9, 2011/01/11, 17: 00: 46.827, XXXXX072 \ QTAgent32.exe, Pengecualian Tertangkap Tertangkap, melaporkan melalui Watson: [Pesan pengecualian]

Dalam kasus saya, saya memiliki FileSystemWatcher yang membuat kesalahan pada utas terpisah.

bendewey
sumber
bagaimana kamu mengatasinya? Saya menggunakan beberapa kode contoh dari M $ yang membungkus FileSystemWatcher dalam layanan dan membuat alur kerja WF di sekitarnya. Saya mendapatkan banyak ini ...
ekkis
Dalam kasus saya, dua tes gagal. Ketika saya pergi ke panel Output dan memilih Tes , itu menyebutkan "Salah satu benang latar belakang melemparkan pengecualian" ... pada kenyataannya, 9 NullReferenceExceptions sedang menunggu saya dengan jejak tumpukan. Terima kasih, ini sangat membantu!
Qwertie
3

Saya mengalami Masalah yang sama dan menyelesaikannya saat Menghapus

Environment.Exit(0);

Jadi saya cukup yakin, bahwa kesalahan ini terjadi saat pengujian atau metode Anda sedang diuji, menyebabkan proses eksekusi dihentikan.

Gon
sumber
2

Terima kasih telah memposting pertanyaan. Saya baru saja mengalami masalah ini dan menemukan penyebab yang mungkin Anda hadapi.

Pengecualian asinkron mungkin telah terjadi

Selama pengaturan pengujian saya, saya membuat objek yang mengantrekan thread pekerja di kumpulan thread. Jika saya menjalankan debugging cukup cepat, kode saya lolos.

Jika utas pekerja dimulai dan memiliki kesalahan SEBELUM pengaturan pengujian selesai, maka saya mendapatkan hasil Dibatalkan tanpa alasan.

Jika utas pekerja dimulai dan memiliki kesalahan SETELAH pengujian dimulai, maka saya mendapatkan hasil dari: Kesalahan - Proses agen dihentikan saat pengujian sedang berjalan.

Penting untuk diperhatikan: ini adalah komponen yang saya gunakan selama beberapa pengujian saya. Jika framework pengujian menemukan terlalu banyak error ini, pengujian lainnya akan dibatalkan.

Semoga ini membantu

Brent VanderMeide
sumber
Terima kasih atas jawabannya. Saya sadar bahwa pengecualian asinkron dapat menyebabkan sesuatu yang mirip dengan apa yang saya lihat, tetapi saya hampir yakin bahwa bukan itu masalahnya. Kode untuk aplikasi web, dan kami tidak melakukan apa pun secara asinkron. Juga, tampaknya tes mana yang gagal itu acak.
driis
2

Saya menambahkan blok coba / tangkap ke descructor ~ ClassName () {} yang ditentukan dalam kelas apa pun yang terlibat dalam pengujian saya. Ini memperbaiki masalah saya.

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

Untuk mengetahui di mana pengecualian itu dilemparkan, klik hyperlink "Test Run Error" di sebelah ikon tanda seru di jendela Hasil Tes. Jendela dengan jejak tumpukan dibuka.

Ini sangat membantu untuk melacak kesalahan!

BlackTuareg
sumber
1

Saya memiliki masalah yang sama dan itu disebabkan oleh finalizer untuk sumber daya yang tidak dikelola (penulis file yang tidak dibuang dengan benar karena beberapa alasan).

Setelah membungkus kode finalizer dalam uji coba yang menelan pengecualian, masalah tersebut menghilang. Saya tidak merekomendasikan menelan pengecualian seperti itu, jadi jelas akan bijaksana untuk mencari tahu mengapa pengecualian itu terjadi sejak awal.

Ben Stabile
sumber
1

Saya mengalami hal ini pada kesempatan yang aneh, dan pelakunya hampir selalu ternyata threading.

Anehnya, semua pengujian akan bekerja dengan baik di mesin pengembangan, lalu gagal secara acak di server build.

Pada pemeriksaan lebih dekat ternyata meskipun tes terdaftar sebagai lulus pada kotak dev, ada pengecualian yang dilontarkan. Pengecualian diberikan pada utas terpisah yang tidak dianggap sebagai kesalahan.

Detail pengecualian sedang dicatat ke jejak pengujian, jadi kami dapat mengidentifikasi kode / pengujian mana yang perlu dimodifikasi.

Semoga ini bisa membantu seseorang.

Abu
sumber
0

Dalam kasus saya, saya memiliki beberapa unit tes untuk layanan WCF. Layanan WCF ini memulai 2 pengatur waktu.
Pengatur waktu tersebut menyebabkan efek samping.
-> Saya menonaktifkan timer ini secara default dan semuanya baik-baik saja!

BTW: Saya menggunakan WCFMock untuk memalsukan layanan WCF, jadi saya memiliki pengujian unit "nyata" di sekitar layanan WCF saya

Peter Gfader
sumber
0

Kesalahan ini juga disebabkan oleh Finalizer untuk saya.
Finalizer secara akurat memanggil beberapa kode DB yang tidak dipermainkan. Butuh beberapa saat untuk menemukannya karena itu bukan kelas yang saya tulis dan referensi ke sana terkubur cukup dalam beberapa kelas.

Cwoo
sumber
0

Saya telah mengalami masalah serupa di mana tes gagal di TestInitialize dan juga menjalankan kode dari ddl dari proyek saya yang lain. Saya mendapatkan pesan kesalahan seperti yang dijelaskan di atas dan jika saya mencoba untuk men-debug pengujian, pengujian akan dibatalkan tanpa detail pengecualian.

Saya menduga bahwa masalahnya mungkin bahwa dll dari proyek saya yang lain berasal dari proyek Visual Studio 2012 dan saya menjalankan tes saya dalam proyek VS2010, dan / atau mungkin versi dll UnitTestFramwork dari 2 proyek tidak cocok.

DevDave
sumber
0

Masalahnya juga bisa dipicu oleh Exception atau Stackoverflow di Constructor of a TestClass.

phil soady
sumber
0

Karena kesalahan ini dapat memiliki banyak penyebab berbeda, saya ingin menambahkan satu lagi untuk kelengkapan utas ini.

Jika semua pengujian Anda dibatalkan seperti yang dijelaskan oleh OP, penyebabnya mungkin konfigurasi project yang salah. Dalam kasus saya, kerangka target ditetapkan ke .NETFramework 3.5. Menyetelnya ke versi yang lebih tinggi melalui halaman properti proyek (tab Aplikasi ) menyelesaikan masalah.

Selamat Malam Kebanggaan Nerd
sumber
0

Saya dapat menentukan apa yang menyebabkan masalah saya dengan melihat di Windows Logs > entri log aplikasi dalam Windows Event Viewer . Cari entri pada saat tes gagal. Saya memiliki entri Kesalahan yang mirip dengan di bawah ini:

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

Itu memang pengecualian referensi nol dalam metode yang dipanggil dari finalizer kelas.

Dib
sumber
0

Bagi siapa pun yang mengalami pertanyaan lama ini dan bertanya-tanya apa yang terlempar dari utas mereka, berikut tipnya. Menggunakan Task.Run (sebagai lawan, katakanlah, Thread.Start) akan melaporkan pengecualian utas anak jauh lebih andal. Singkatnya, alih-alih ini:

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

Melakukan hal ini:

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

Dan log kesalahan Anda seharusnya jauh lebih berguna.

Jason
sumber