Tôi có thể viết vào bàn điều khiển trong bài kiểm tra đơn vị không? Nếu có, tại sao cửa sổ giao diện điều khiển không mở?


148

Tôi có một dự án thử nghiệm trong Visual Studio. Tôi sử dụng Microsoft.VisualStudio.TestTools.UnitTesting.

Tôi thêm dòng này vào một trong những bài kiểm tra đơn vị của mình:

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

Khi tôi chạy thử nghiệm, kiểm tra vượt qua nhưng cửa sổ giao diện điều khiển hoàn toàn không mở.

Có cách nào để làm cho cửa sổ Console có thể tương tác thông qua kiểm tra đơn vị không?


1
Nó thực sự phụ thuộc vào người chạy. Bạn có thể sử dụng TestDriven.Net (một ứng dụng tuyệt vời, miễn phí cho sử dụng cá nhân, người chạy thử) - Console.WriteLine sẽ ghi vào khung đầu ra VS.
hiếm khi

1
Cảm ơn bạn đã truyền bá từ trên TestDriven.Net
GrayFox374

NCrunch cũng có tính năng này, một mình làm cho nó đáng giá IMO. Tôi có một Dumpphương thức mở rộng để xuất nội dung của đối tượng vào bàn điều khiển, làm cho mọi thứ dễ dàng hơn để gỡ lỗi. i.imgur.com/MEZwy7X.png
DharmaTurtle

Câu trả lời:


125

LƯU Ý: Câu trả lời ban đầu bên dưới sẽ hoạt động cho mọi phiên bản VS lên đến VS2012. VS2013 dường như không có cửa sổ Kết quả kiểm tra nữa. Thay vào đó, nếu bạn cần đầu ra dành riêng cho thử nghiệm, bạn có thể sử dụng đề xuất của @ Stretch Trace.Write()để ghi đầu ra vào cửa sổ đầu ra.


Các Console.Writephương pháp không viết thư cho "bàn giao" - nó viết vào bất cứ điều gì bị mắc lưỡi câu lên đến xử lý đầu ra tiêu chuẩn cho quá trình chạy. Tương tự, Console.Readđọc đầu vào từ bất cứ thứ gì được nối với đầu vào tiêu chuẩn.

Khi bạn chạy thử nghiệm đơn vị qua VS2010, đầu ra tiêu chuẩn được chuyển hướng bởi khai thác thử nghiệm và được lưu trữ như một phần của đầu ra thử nghiệm. Bạn có thể thấy điều này bằng cách nhấp chuột phải vào cửa sổ Kết quả kiểm tra và thêm cột có tên "Đầu ra (StdOut)" vào màn hình. Điều này sẽ hiển thị bất cứ điều gì đã được viết cho thiết bị xuất chuẩn.

Bạn có thể tự mở một cửa sổ giao diện điều khiển, sử dụng P / Gọi như @ sinni800 nói. Từ việc đọc AllocConsoletài liệu, có vẻ như chức năng sẽ thiết lập lại stdinstdoutxử lý để trỏ đến cửa sổ giao diện điều khiển mới. (Tôi không chắc chắn 100% về điều đó; có vẻ như tôi đã sai khi tôi đã chuyển hướng stdoutcho Windows để đánh cắp nó từ tôi, nhưng tôi đã không thử.)

Tuy nhiên, nói chung, tôi nghĩ đó là một ý tưởng tồi; nếu tất cả những gì bạn muốn sử dụng bàn điều khiển là để đổ thêm thông tin về bài kiểm tra đơn vị của bạn, thì đầu ra là dành cho bạn. Tiếp tục sử dụng Console.WriteLinetheo cách của bạn và kiểm tra kết quả đầu ra trong cửa sổ Kết quả kiểm tra khi hoàn tất.


Hãy thử mở WindowsApplication mới, sử dụng AllocConsole để phân bổ một giao diện điều khiển và nó sẽ ghi ở đó. Tôi không biết những gì nó thực sự làm nhưng nó có thể không hoạt động trong môi trường Kiểm tra đơn vị. Thật tuyệt khi biết ...
sinni800

giờ đọc lại AllocConsoletài liệu, tôi có thể không chính xác, nhưng tôi phải kiểm tra nó.
Michael Edenfield

2
Đối với tôi, nhận xét này của Michael cho biết tất cả mọi thứ tôi cần suy nghĩ: "Khi bạn chạy thử nghiệm đơn vị qua VS2010, đầu ra tiêu chuẩn được chuyển hướng bởi khai thác thử nghiệm và được lưu trữ như một phần của đầu ra thử nghiệm."
Robert Patterson

5
trong VS2013, nếu bạn viết trên Bảng điều khiển, sẽ có nhãn liên kết [Đầu ra] trên TestExplorer / Test / Summary. Nhấp vào nó và bạn nhận được đầu ra mong muốn. Chờ đợi? Bạn cũng muốn gọi Console.ReadLine () ??
Visar

3
Trong V2017 (Cộng đồng), đi đến "trình thám hiểm thử nghiệm", chọn mục kết quả kiểm tra trong danh sách, sau đó nhấp vào liên kết "đầu ra" trên cửa sổ khác (cửa sổ kết quả kiểm tra?). Vì nó có thể sẽ bị cắt ngắn, hãy sử dụng "sao chép tất cả" và qua một nơi khác.
heringer

180

Ai đó đã nhận xét về chức năng rõ ràng mới này trong VS2013. Tôi không chắc lúc đầu anh ấy có ý gì, nhưng bây giờ tôi làm vậy, tôi nghĩ đó xứng đáng là câu trả lời của riêng mình.

Chúng ta có thể sử dụng Console.WriteLine bình thường và đầu ra được hiển thị, không chỉ trong cửa sổ đầu ra, mà trong một cửa sổ mới sau khi chúng ta nhấp vào "Đầu ra" trong chi tiết kiểm tra.

nhập mô tả hình ảnh ở đây


2
Giải pháp tuyệt vời. Xác nhận nó hoạt động trong VS2015 Enterprise.
garfbradaz

6
Thật không may, người ta không thể chọn bất kỳ văn bản nào trong khu vực đầu ra đó để sao chép và dán :( Họ đang nghĩ gì?!
HOẶC Mapper

3
@ORMapper, nhấp chuột phải vào khu vực "Đầu ra tiêu chuẩn" và chọn sao chép tất cả
bychance

2
@ Ovi-WanKenobi hãy thử xuất một cái gì đó với Console.Write
Tiago Duarte

5
Trong so với năm 2017, bạn phải chọn MACHI bài kiểm tra đang chạy, sau đó nhấp vào đầu ra - không hữu ích lắm khi bạn có nhiều bài kiểm tra. Tôi muốn xem tất cả các đầu ra cùng nhau - không phải trong các cửa sổ riêng biệt.
inliner49er

37

Bạn có thể sử dụng dòng này để ghi vào Cửa sổ đầu ra của Visual Studio:

System.Diagnostics.Debug.WriteLine("Matrix has you...");

Phải chạy trong chế độ Gỡ lỗi.


7
Nó không viết trên VS của tôi
Luis Filipe

1
kiểm tra chủ đề này để biết chi tiết - stackoverflow.com/questions/1159755/ trộm
Dmitry Pavlov

1
Điều này làm việc rất tốt cho tôi khi sử dụng MSTest và R # để xem đầu ra. Cảm ơn!
Isaac Baker

2
@William nó sẽ hiển thị nếu bạn gỡ lỗi một bài kiểm tra, nhưng không phải nếu bạn chỉ đơn giản chạy nó mà không gỡ lỗi.
yoyo

29

Như đã nêu, các bài kiểm tra đơn vị được thiết kế để chạy mà không cần tương tác.

Tuy nhiên, bạn có thể gỡ lỗi kiểm tra đơn vị, giống như bất kỳ mã nào khác. Cách dễ nhất là sử dụng nút Gỡ lỗi trong tab Kết quả kiểm tra.

Có thể gỡ lỗi có nghĩa là có thể sử dụng các điểm dừng. Sau đó, có thể sử dụng các điểm dừng, có nghĩa là có thể sử dụng Tracepoints , điều mà tôi thấy cực kỳ hữu ích trong việc gỡ lỗi mỗi ngày.

Về cơ bản, Tracepoints cho phép bạn ghi vào cửa sổ đầu ra (hoặc chính xác hơn là đầu ra tiêu chuẩn). Tùy chọn, bạn có thể tiếp tục chạy hoặc bạn có thể dừng lại như một điểm dừng thông thường. Điều này cung cấp cho bạn "chức năng" mà bạn đang yêu cầu, mà không cần phải xây dựng lại mã của bạn hoặc điền thông tin gỡ lỗi.

Đơn giản chỉ cần thêm một điểm dừng, và sau đó nhấp chuột phải vào điểm dừng đó. Chọn tùy chọn "Khi nhấn ...": Khi nhấn tùy chọn

Điều này dẫn đến hộp thoại: Khi điểm dừng được nhấn

Một số điều cần lưu ý:

  1. Lưu ý rằng điểm dừng bây giờ được hiển thị dưới dạng hình thoi, thay vì hình cầu, biểu thị điểm dấu vết
  2. Bạn có thể xuất giá trị của một biến bằng cách đặt nó như {this}.
  3. Bỏ chọn hộp kiểm "Tiếp tục thực thi" để ngắt mã trên dòng này, giống như bất kỳ điểm dừng thông thường nào
  4. Bạn có tùy chọn chạy macro. Hãy cẩn thận - bạn có thể gây ra tác dụng phụ có hại.

Xem tài liệu để biết thêm chi tiết.


24

Có một số cách để ghi đầu ra từ bài kiểm tra đơn vị Visual Studio trong C #:

  • Console.Write - Khai thác kiểm tra Visual Studio sẽ nắm bắt điều này và hiển thị nó khi bạn chọn kiểm tra trong Test Explorer và nhấp vào liên kết đầu ra. Có không hiển thị trong Visual Studio Output Window khi một trong hai chạy hoặc gỡ một thử nghiệm đơn vị (cho là đây là một lỗi).
  • Debug.Write - Khai thác thử nghiệm Visual Studio sẽ nắm bắt điều này và hiển thị nó trong đầu ra thử nghiệm. Sẽ xuất hiện trong Cửa sổ đầu ra Visual Studio khi gỡ lỗi kiểm tra đơn vị, trừ khi các tùy chọn Gỡ lỗi Visual Studio được cấu hình để chuyển hướng Đầu ra sang Cửa sổ ngay lập tức. Sẽ không có gì xuất hiện trong Cửa sổ đầu ra (hoặc ngay lập tức) nếu bạn chỉ cần chạy thử mà không cần gỡ lỗi. Theo mặc định chỉ có sẵn trong bản dựng Gỡ lỗi (nghĩa là khi hằng số DEBUG được xác định).
  • Trace.Write - Khai thác thử nghiệm Visual Studio sẽ nắm bắt điều này và hiển thị nó trong đầu ra thử nghiệm. xuất hiện trong Visual Studio Output (hoặc ngay) Window khi gỡ lỗi một thử nghiệm đơn vị (nhưng không phải khi chỉ đơn giản là chạy thử nghiệm mà không cần gỡ lỗi). Theo mặc định có sẵn trong cả hai bản dựng Gỡ lỗi và Phát hành (nghĩa là khi hằng số TRACE được xác định).

Khẳng định trong Visual Studio 2013 Professional.


1
Lưu ý rằng các quy tắc hơi khác nhau nếu bạn sử dụng NUnit và tiện ích mở rộng Bộ điều hợp thử nghiệm NUnit cho Visual Studio thay vì khung thử nghiệm tích hợp của Microsoft.
yoyo

9

Bạn có thể dùng

Trace.WriteLine() 

để ghi vào cửa sổ đầu ra khi gỡ lỗi không đáng kể.


5

Trong visual Studio 2017, "TestContext" không hiển thị liên kết đầu ra vào Test Explorer. Tuy nhiên, Trace.Writeline () hiển thị liên kết Ouput.


Chỉ là một FYI, Trace.WriteLine
TroySteven

4

Trước hết, các bài kiểm tra đơn vị, theo thiết kế , được cho là chạy hoàn toàn không có tương tác.

Bỏ qua chuyện đó, tôi không nghĩ có khả năng đã nghĩ đến.

Bạn có thể thử hack với AllocConsole P / Invoke sẽ mở giao diện điều khiển ngay cả khi ứng dụng hiện tại của bạn là ứng dụng GUI. Các Consolelớp sau đó sẽ gửi đến console hiện nay mở ra.


1
Hmm .. Động lực chính của tôi là viết một số dữ liệu bổ sung vào bàn điều khiển để xem một số chi tiết sâu hơn. Nó sẽ là thứ adhoc mà tôi có thể không cần sau này.
bút chì Làm


2

Thông báo đầu ra IMHO chỉ liên quan đến trường hợp Thử nghiệm thất bại trong hầu hết các trường hợp. Tôi tạo thành định dạng dưới đây, bạn cũng có thể làm cho riêng mình. Điều này được hiển thị trong chính VS Test Explorer Window.

Làm cách nào để gửi thông báo này trong VS Test Explorer Window? Một mã mẫu như thế này sẽ hoạt động.

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

Bạn có thể có một lớp riêng dành riêng cho việc này cho bạn. Hy vọng nó giúp!


Tôi chắc chắn tôi cũng sẽ thêm cái này vào. Trong Visual Studio 2019 bằng XUNIT, bạn có thể thực hiện các thao tác sau: Assert.True (thành công, "XÓA GHI LẠI TUYỆT VỜI"); XÓA RECORD FAILED sau đó sẽ hiển thị trong VS 2019 Test Explorer. Một lần nữa, giống như câu trả lời ở trên, điều này chỉ hoạt động khi bài kiểm tra đơn vị của bạn không đạt điều kiện mong đợi.
TroySteven

1

Tôi có một giải pháp dễ dàng hơn (mà tôi đã sử dụng gần đây, vì một số lý do lười biếng). Thêm phương thức này vào lớp bạn đang làm việc:

public static void DumbDebug(string message)
    {
        File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb, I wish microsoft had more obvious solutions to it's solutions' problems.");
    }

Sau đó ... mở thư mục AdHocConsole, sắp xếp theo thời gian đã tạo. Hãy chắc chắn rằng khi bạn thêm 'câu lệnh in', chúng sẽ khác biệt, nếu không sẽ có sự tung hứng.


0

Visual Studio cho máy Mac

Không có giải pháp nào khác hoạt động trên VS cho Mac

Nếu bạn đang sử dụng NUnit , bạn có thể thêm .NET Dự án Bảng điều khiển nhỏ vào Giải pháp của mình, sau đó tham khảo dự án bạn muốn kiểm tra trong Tài liệu tham khảo của Dự án Bảng điều khiển mới đó .

Bất cứ điều gì bạn đang làm trong [Test()]phương pháp của bạn đều có thể được thực hiện trong Mainứng dụng bảng điều khiển theo cách này:

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the Unit Test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

Bạn được tự do sử dụng Console.WriteConsole.WriteLinetrong mã của bạn trong những trường hợp này.

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.