VS 2010 Test Runner lỗi "Quá trình tác nhân đã bị dừng trong khi thử nghiệm đang chạy."


101

Trong Visual Studio 2010, tôi có một số bài kiểm tra đơn vị. Khi tôi chạy nhiều thử nghiệm cùng một lúc bằng danh sách thử nghiệm, đôi khi tôi gặp lỗi sau cho một hoặc nhiều thử nghiệm:

Quá trình tác nhân đã bị dừng trong khi thử nghiệm đang chạy.

Không bao giờ cùng một bài kiểm tra không thành công, và nếu tôi cố gắng chạy lại bài kiểm tra, nó sẽ thành công.

Tôi đã tìm thấy báo cáo lỗi này trên Connect , có vẻ là cùng một vấn đề, nhưng nó không đưa ra giải pháp.

Có ai khác nhìn thấy hành vi này? Làm thế nào tôi có thể tránh nó?

Biên tập

Tôi vẫn gặp phải lỗi này và nhiều đồng nghiệp của tôi cũng vậy trên cùng một thiết lập phần mềm / phần cứng. Tôi đã đánh giá các câu trả lời cho đến nay, nhưng chúng không giải quyết được vấn đề. Tôi đang bắt đầu thưởng cho một giải pháp cho vấn đề này.


Tôi đang nhận được điều tương tự. Tôi đang tìm hiểu nó nhưng không có giải pháp cho đến nay
Đánh dấu

Bất kỳ tin tức về điều này? Cùng một vấn đề ở đây ...
Peter Gfader

@Peter, hãy xem bình luận của tôi bên dưới câu trả lời được chấp nhận. Đó là giải pháp của tôi, nhưng tôi không biết liệu vấn đề của bạn có tương tự không.
driis

Tôi đã có hành vi tương tự với một ngoại lệ không thận trọng. Ngoại lệ đã hiển thị đối với tôi khi tôi chạy Visual Studio trên máy chủ xây dựng và nhận được Cửa sổ thông báo. Vì cửa sổ xác nhận, bài kiểm tra không thể tiếp tục.

Câu trả lời:


41

Tôi vừa gặp sự cố tương tự: một số thử nghiệm không thành công và chúng khác nhau trong các lần chạy thử nghiệm khác nhau. Tôi không biết chính xác lý do tại sao nó xảy ra, nhưng nó bắt đầu xảy ra khi tôi thêm một bản hoàn thiện vào một trong các lớp học của mình. Khi tôi vô hiệu hóa trình hoàn thiện - sự cố sẽ biến mất. Khi tôi bật trình chỉnh sửa cuối cùng - vấn đề trở lại.

Hiện tại tôi không biết phải làm thế nào để vượt qua chuyện này.


16
CẢM ƠN - câu trả lời này dẫn tôi đến giải pháp. Tôi chỉ có bản hoàn thiện cho một vài loại và chắc chắn, việc loại bỏ chúng cũng loại bỏ được vấn đề. Khi điều tra thêm, tôi đã phát hiện ra một lỗi nhỏ trong một trình hoàn thiện, lỗi này chỉ xảy ra khi một ngoại lệ được đưa vào hàm tạo và trình hoàn thiện cố gắng hoàn thiện một đối tượng chưa được xây dựng hoàn chỉnh. Kết luận: Nếu một ngoại lệ xảy ra trong trình hoàn thiện trên một loại và trình hoàn thiện đó chạy trước khi tất cả các thử nghiệm kết thúc, Visual Studio sẽ đưa ra lỗi mà tôi đang gặp phải; mà không cần giải thích gì thêm, và trong các bài kiểm tra ngẫu nhiên.
driis

6
Tôi không có trình hoàn thiện / trình hủy trong mã của mình ... ~ MyClass () và gặp lỗi tương tự. Các bài kiểm tra chạy với Resharper đều có màu xanh lá cây
Peter Gfader

6
Vấn đề với các ngoại lệ chưa suy nghĩ trong trình hoàn thiện là một trường hợp đặc biệt của các ngoại lệ chưa được giải quyết trong các tác vụ nền có thể được bắt đầu hoặc lên lịch (có thể ngầm hiểu) bằng một số thử nghiệm và có thể tiếp tục thực thi ngay cả khi thử nghiệm đã hoàn thành.
satorg

1
Giống như Peter, người chạy thử Resharper cho tôi tất cả màu xanh lá cây. VS 2010 chạy thử nghiệm không thành công trên lớp với hàm hủy.
RyBolt

1
Tôi đã vô tình mã hóa một vòng lặp đệ quy vô hạn trong phương thức Dispose () của mình, điều này cũng gây ra điều này.
Robert

88

Thông báo này là do một ngoại lệ trên một chuỗi khác với chuỗi kiểm tra đang thực thi . Tất cả các câu trả lời cho đến nay đều tập trung vào lời giải thích đơn giản này. Đó là một lỗi đã biết trong Visual Studio không hiển thị bất kỳ thông tin hợp lý nào trong trường hợp đó.

Trình chạy thử nghiệm của Visual Studio hoàn toàn bị nghẹt thở nếu một luồng không phải là luồng thử nghiệm đang thực thi ném ra một ngoại lệ: Nó bị nuốt và không có đầu ra, không có cơ hội để chặn và gỡ lỗi và không có gì ngoại trừ một mớ hỗn độn âm ỉ bị đốt cháy được cho là đơn vị của bạn kiểm tra.


Điều tương tự cũng xảy ra với tôi - bài kiểm tra của tôi đã tạo ra một chuỗi riêng biệt, điều này đã nhận được một ngoại lệ. Việc nắm bắt ngoại lệ bên trong luồng ít nhất cho phép tôi in nó và biết điều gì đang xảy ra. Tuy nhiên, hãy cẩn thận không đặt Assert.Fail () trong khối bắt của luồng - điều này tạo ra một ngoại lệ riêng biệt đưa bạn trở lại ngay nơi bạn bắt đầu.
Kyle Krull

4
điều tương tự đối với tôi, ngoại trừ một chồng tràn, mà là rất vất vả để theo dõi trong C # so với java ...
John Gardner

Thật vậy, tôi nhận thấy điều này xảy ra khi tôi bắt đầu sử dụng các đối tượng Thread và gọi Abort () để dừng chúng.
espaciomore

1
Điều này cũng xảy ra khi một async voidphương pháp đó được gọi là trong quá trình thử ném một ngoại lệ
Mathias Becher

1
Lưu ý rằng trx có thể chứa thông tin lỗi, bạn có thể xem thông tin đó bằng cách mở nó trong trình soạn thảo văn bản hoặc trong Visual Studio và nhấp vào liên kết Lỗi chạy thử nghiệm trong cửa sổ Kết quả kiểm tra .
Ohad Schneider

16

Tôi đang gặp sự cố này và hóa ra là sự cố trong mã của tôi mà Khung kiểm tra không bắt đúng cách. Một chút tình cờ tái cấu trúc đã để lại cho tôi mã này:

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

Tất nhiên, đây là một đệ quy vô hạn và gây ra một StackOverflowException (tôi đoán vậy). Điều này gây ra đáng sợ: "Quá trình tác nhân đã bị dừng lại trong khi thử nghiệm đang chạy."

Kiểm tra mã nhanh chóng cho tôi thấy sự cố và các bài kiểm tra của tôi hiện đang chạy tốt. Hy vọng điều này sẽ hữu ích - có thể đáng để kiểm tra mã để tìm sự cố hoặc có thể trích xuất một chút vào ứng dụng bảng điều khiển và kiểm tra xem nó hoạt động bình thường ở đó.


3
Đây không phải là vấn đề (tôi biết vì mỗi lần kiểm tra đều thất bại khác nhau), nhưng cảm ơn bạn đã dành thời gian trả lời.
driis

6
+1 vì đây là một trong nhiều câu trả lời hợp lệ cho vấn đề này. ngoại lệ SO trong một phương thức sstatic trên một trong các lớp của tôi đã gây ra sự cố này.
Peter T. LaComb Jr.

6
+1, tôi cũng đã thấy điều này. Gỡ lỗi kiểm tra (trong VS 11) phát hiện ra vấn đề khá nhanh chóng.
Jeremy McGee

Đồng ý với Jeremy. Nếu bạn gỡ lỗi các bài kiểm tra đơn vị thì nó sẽ dừng lại khi ngoại lệ được ném ra. Tuy nhiên, nếu bạn chỉ chạy các bài kiểm tra đơn vị, tất cả chúng sẽ bật đèn xanh. Rất kỳ quái.
Andrew Stephens

8

Tôi có thể tìm ra nguồn gốc vấn đề của mình bằng cách xem trong tệp kết quả kiểm tra (/TestResults/*.trx) Nó cung cấp đầy đủ chi tiết về ngoại lệ xảy ra trong chuỗi nền và khi tôi giải quyết ngoại lệ đó, "tác nhân đã xử lý đã dừng lại ... "lỗi đã biến mất.

Trong trường hợp của tôi, tôi đã vô tình khởi chạy GUI trong bài kiểm tra đơn vị của mình, điều này cuối cùng khiến System.ComponentModel.InvalidAsynchronousStateException được ném.

Vì vậy, tệp .trx của tôi chứa:

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

Điều này không cung cấp bất kỳ thông tin nào về việc kiểm tra nào gây ra lỗi, nhưng nó đã cho tôi thấy ngoại lệ nằm ở đâu, điều này rất hữu ích.


5

Thông báo này thường được tạo khi quá trình kiểm tra gặp sự cố và có thể xảy ra khi có một ngoại lệ chưa được xử lý trên một chuỗi nền, xảy ra tràn ngăn xếp hoặc một lệnh gọi rõ ràng đến Process.GetCurrentProcess().Kill()hoặcEnvironment.Exit . Một nguyên nhân khác có thể là do vi phạm quyền truy cập trong mã không được quản lý.

Có điều chưa ai đề cập là có thể có thêm thông tin trong nhật ký sự kiện. Thông thường bạn sẽ không nhận được nhiều thông tin về lý do tại sao thử nghiệm bị lỗi trong kết quả, tuy nhiên trong trường hợp có ngoại lệ không được xử lý trên luồng nền, thì khung thử nghiệm sẽ ghi chi tiết vào Nhật ký sự kiện ứng dụng với nguồn VSTTExecution. Nếu không có thông tin nào được ghi vào nhật ký sự kiện thì rất có thể là một trong những nguyên nhân khác được liệt kê ở trên.


4

Trong trường hợp của tôi, giải pháp đã được giải quyết bằng cách kiểm tra Cửa sổ đầu ra .

'QTAgent32.exe' (Managed (v4.0.30319)): Đã tải 'C: \ TestResults \ bdewey_XXXXXX072 2011-01-11 17_00_40 \ Out \ MyCode.dll', Đã tải các ký hiệu. E, 9024, 9, 2011/01/11, 17: 00: 46.827, XXXXX072 \ QTAgent32.exe, Không xử lý ngoại lệ bị bắt, báo cáo qua Watson: [Thông báo ngoại lệ]

Trong trường hợp của tôi, tôi có một FileSystemWatcher đang gặp lỗi trên một chuỗi riêng biệt.


bạn đã giải quyết nó như thế nào Tôi đang sử dụng một số mã mẫu từ M $ bao bọc FileSystemWatcher trong một dịch vụ và tạo quy trình làm việc WF xung quanh đó. Tôi nhận được rất nhiều những ...
ekkis

Trong trường hợp của tôi, hai bài kiểm tra không thành công. Khi tôi đi đến ngăn Đầu ra và chọn Kiểm tra , nó đề cập đến "Một trong các luồng nền đã ném ngoại lệ" ... trên thực tế, 9 NullReferenceExceptions đang đợi tôi với dấu vết ngăn xếp. Cảm ơn, điều này rất hữu ích!
Qwertie

3

Tôi gặp phải vấn đề tương tự và đã giải quyết nó trong khi xóa

Environment.Exit(0);

Vì vậy, tôi khá chắc chắn rằng lỗi này xảy ra trong khi thử nghiệm hoặc phương pháp của bạn đang được thử nghiệm, đang khiến quá trình thực thi kết thúc.


2

Cảm ơn vì đã đăng câu hỏi. Tôi vừa gặp sự cố này và đã tìm ra nguyên nhân mà bạn có thể gặp phải.

Một ngoại lệ không đồng bộ có thể đã xảy ra

Trong quá trình thiết lập thử nghiệm của mình, tôi tạo một đối tượng xếp hàng một chuỗi công nhân trong nhóm luồng. Nếu tôi chạy gỡ lỗi đủ nhanh, mã của tôi sẽ vượt qua.

Nếu chuỗi công nhân khởi động và có lỗi TRƯỚC KHI quá trình thiết lập kiểm tra hoàn tất, thì tôi nhận được kết quả Bị hủy bỏ mà không có lý do.

Nếu chuỗi công nhân bắt đầu và có lỗi SAU KHI quá trình kiểm tra bắt đầu, thì tôi nhận được kết quả là: Lỗi - Quá trình tác nhân đã bị dừng trong khi kiểm tra đang chạy.

Điều quan trọng cần lưu ý: đây là thành phần mà tôi sử dụng trong suốt một số thử nghiệm của mình. Nếu khung thử nghiệm gặp quá nhiều lỗi này, nó sẽ hủy bỏ phần còn lại của các thử nghiệm.

Hi vọng điêu nay co ich


Cảm ơn bạn đã trả lời. Tôi biết rằng các ngoại lệ không đồng bộ có thể gây ra điều gì đó tương tự như những gì tôi đang thấy, nhưng tôi gần như chắc chắn rằng không phải vậy. Mã dành cho ứng dụng web và chúng tôi không thực hiện bất kỳ điều gì không đồng bộ. Ngoài ra, có vẻ như thử nghiệm nào không thành công là ngẫu nhiên.
driis

2

Tôi đã thêm các khối try / catch vào trình mô tả ~ ClassName () {} được xác định trong bất kỳ lớp nào liên quan đến các bài kiểm tra của tôi. Điều này đã khắc phục sự cố cho tôi.

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

2

Để tìm ra vị trí của ngoại lệ, hãy nhấp vào siêu liên kết "Lỗi Chạy Thử nghiệm" bên cạnh biểu tượng dấu chấm than trong cửa sổ Kết quả Kiểm tra. Một cửa sổ có dấu vết ngăn xếp được mở ra.

Điều này giúp ích rất nhiều để theo dõi lỗi!


1

Tôi đã gặp vấn đề tương tự và vấn đề là do bản hoàn thiện cho tài nguyên không được quản lý (trình ghi tệp không được xử lý đúng cách vì một số lý do).

Sau khi gói mã cuối cùng trong một lần thử bắt ngoại lệ, sự cố đã biến mất. Tôi không khuyên bạn nên nuốt các ngoại lệ như vậy, vì vậy rõ ràng sẽ là khôn ngoan khi tìm hiểu lý do tại sao ngoại lệ xảy ra ngay từ đầu.


1

Tôi đã để điều này xảy ra vào một dịp kỳ lạ, và thủ phạm hầu như luôn luôn hóa ra là một sợi dây.

Thật kỳ lạ là tất cả các thử nghiệm sẽ hoạt động tốt trên các máy phát triển, sau đó ngẫu nhiên thất bại trên các máy chủ xây dựng.

Khi kiểm tra kỹ hơn, hóa ra là mặc dù các bài kiểm tra được liệt kê là đã vượt qua trên các hộp dành cho nhà phát triển, nhưng vẫn có những ngoại lệ được ném ra. Các ngoại lệ đã được ném trên một chuỗi riêng biệt mà không được chọn như một lỗi.

Các chi tiết ngoại lệ đã được ghi lại dựa trên dấu vết thử nghiệm, vì vậy chúng tôi có thể xác định mã / thử nghiệm nào cần được sửa đổi.

Hy vọng điều này sẽ giúp ai đó.


0

Trong trường hợp của tôi, tôi đã có một số bài kiểm tra đơn vị cho một dịch vụ WCF. Dịch vụ WCF này đã khởi động 2 bộ hẹn giờ.
Những bộ hẹn giờ đó gây ra tác dụng phụ.
-> Tôi tắt các bộ hẹn giờ này theo mặc định và mọi thứ đều ổn!

BTW: Tôi sử dụng WCFMock để giả mạo dịch vụ WCF, vì vậy tôi có các bài kiểm tra đơn vị "thực" xung quanh dịch vụ WCF của mình


0

Lỗi này cũng do tôi gây ra bởi Finalizer.
Finalizer đang thực sự gọi một số mã DB mà không bị chế nhạo. Tôi đã mất một lúc để tìm nó vì nó không phải là một lớp học mà tôi đã viết và tài liệu tham khảo về nó đã bị chôn vùi khá nhiều lớp sâu.


0

Tôi đã gặp phải sự cố tương tự trong đó kiểm tra không thành công trong TestInitialize và cũng đang chạy mã từ ddl từ một dự án khác của tôi. Tôi nhận được thông báo lỗi như được mô tả ở trên và nếu tôi cố gắng gỡ lỗi kiểm tra, kiểm tra sẽ bị hủy bỏ mà không có bất kỳ chi tiết ngoại lệ nào.

Tôi nghi ngờ rằng vấn đề có thể là các dll từ dự án khác của tôi là từ một dự án Visual Studio 2012 và tôi đang chạy thử nghiệm của mình trong một dự án VS2010 và / hoặc có thể là các phiên bản dll UnitTestFramwork từ 2 dự án không khớp.


0

Sự cố cũng có thể được kích hoạt bởi Exception hoặc Stackoverflow trong Constructor của TestClass.


0

Vì lỗi này có thể có nhiều nguyên nhân khác nhau, tôi muốn thêm một lỗi khác để hoàn thiện chuỗi này.

Nếu tất cả các thử nghiệm của bạn đang hủy bỏ như OP mô tả, nguyên nhân có thể là do cấu hình dự án sai. Trong trường hợp của tôi, khung mục tiêu được đặt thành .NET Framework 3.5. Đặt nó lên phiên bản cao hơn thông qua trang thuộc tính dự án (tab Ứng dụng ) đã giải quyết được sự cố.


0

Tôi đã có thể xác định điều gì đang gây ra sự cố của mình bằng cách xem mục Nhật ký Windows > Nhật ký ứng dụng trong Trình xem sự kiện Windows . Tìm các mục nhập vào thời điểm thử nghiệm bị đánh bom. Tôi có một mục nhập Lỗi tương tự như bên dưới:

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

Nó thực sự là một ngoại lệ tham chiếu rỗng trong một phương thức được gọi từ trình hoàn thiện lớp.


0

Đối với bất kỳ ai đang gặp phải câu hỏi cũ này và tự hỏi điều gì đang được đưa ra từ (các) chuỗi của họ, đây là một mẹo. Sử dụng Task.Run (trái ngược với Thread.Start) sẽ báo cáo các ngoại lệ luồng con đáng tin cậy hơn nhiều. Tóm lại, thay vì điều này:

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

Làm cái này:

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

Và các bản ghi lỗi của bạn sẽ hữu ích hơn nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.