Làm cách nào để viết đầu ra từ bài kiểm tra đơn vị?


113

Bất kỳ lệnh gọi nào trong đơn vị của tôi đều kiểm tra một trong hai Debug.Write(line)hoặc Console.Write(Line)đơn giản là bị bỏ qua trong khi gỡ lỗi và đầu ra không bao giờ được in. Các lệnh gọi đến các hàm này từ bên trong các lớp tôi đang sử dụng hoạt động tốt.

Tôi hiểu rằng kiểm thử đơn vị có nghĩa là được tự động hóa, nhưng tôi vẫn muốn có thể xuất ra các thông báo từ kiểm thử đơn vị.

Câu trả lời:


128

Hãy thử sử dụng TestContext.WriteLine()văn bản xuất ra trong kết quả thử nghiệm.

Thí dụ:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

"Phép thuật" được mô tả trong MSDN là "Khung thử nghiệm tự động đặt thuộc tính, sau đó bạn có thể sử dụng trong các bài kiểm tra đơn vị."


7
Tôi đã tìm thấy (với VS2013) rằng điều này chỉ in một cái gì đó nếu thử nghiệm được chạy ở chế độ gỡ lỗi.
fusi

3
Có vẻ như việc sử dụng TestContext yêu cầu VS2015 Enterprise (hoặc các phiên bản cao cấp của các phiên bản trước đó), theo tài liệu này
Patrick Steadman

Tôi nhận thấy rằng nếu chuỗi của bạn có dấu ngoặc nhọn trong đó, phương thức sẽ bị lỗi. Vì vậy, "_testContext.WriteLine (" xin chào ");" hoạt động nhưng "_testContext.WriteLine (" he {ll} o ");" không thành công với "System.FormatException: Chuỗi đầu vào không có định dạng đúng."
Mike K,

1
Phương thức WriteLine trong TestContext nhận các tham số giống như Console.WriteWriteLine. Điều đó có nghĩa là chuỗi là một chuỗi định dạng (được ghi lại tại docs.microsoft.com/en-us/dotnet/standard/base-types/… ). Để sử dụng một ký tự {trong một chuỗi, bạn cần phải nhân đôi nó. Để in chuỗi của bạn, hãy sử dụng WriteLine ("he {{ll}} o");
Walter

1
điều này thật thú vị ... mặc dù tôi vẫn không biết tại sao họ không thêm tính năng này và các tính năng tương tự vào lớp cơ sở hoặc giao diện mà chúng tôi có thể sử dụng từ khung công tác để tránh nhầm lẫn.
Niklas

149

Tôi cũng đang cố gắng để Debug hoặc Trace hoặc Console hoặc TestContext hoạt động trong thử nghiệm đơn vị.

Không có phương pháp nào trong số này hoạt động hoặc hiển thị đầu ra trong cửa sổ đầu ra:

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

Visual Studio 2012 trở lên

(từ nhận xét) Trong Visual Studio 2012, không có biểu tượng. Thay vào đó, có một liên kết trong kết quả kiểm tra được gọi là Đầu ra . Nếu bạn nhấp vào liên kết, bạn sẽ thấy tất cả WriteLine.

Trước Visual Studio 2012

Sau đó, tôi nhận thấy trong cửa sổ Kết quả kiểm tra của mình , sau khi chạy kiểm tra, bên cạnh vòng tròn màu xanh lá cây thành công nhỏ , có một biểu tượng khác. Tôi đã nhấp đúp vào nó. Đó là kết quả thử nghiệm của tôi và nó bao gồm tất cả các loại danh sách ở trên.


44
Trong Visual Studio 2012, không có biểu tượng. Thay vào đó, có một liên kết trong kết quả kiểm tra được gọi là "Đầu ra". Nếu bạn nhấp vào liên kết, bạn sẽ thấy tất cả các danh sách.
epotter

16
geez, liên kết "Đầu ra" về bản chất rất khó tìm. Nếu bất kỳ ai đang gặp khó khăn trong việc tìm kiếm nó, hãy tìm nó trong phần Text Explorer, ở dưới cùng. Khi một bài kiểm tra được chọn, nó sẽ hiển thị cho bạn kết quả với "Thời gian đã trôi qua: xxx". Dưới đó là liên kết "Đầu ra".
kevin

@kevin, bạn thấy ở phiên bản VS nào vậy? (Tôi giả sử bạn có nghĩa là "thử nghiệm Explorer" thay vì "Văn bản Explorer.) Tôi không thấy một liên kết đầu ra trong VS2013 nhanh.
Mike C

1
Nếu có ai thắc mắc (như tôi) cái nào trong số này xuất hiện trong tệp TRX (đầu ra kết quả kiểm tra) thì đó là tất cả những thứ ở trên ngoại trừ "Debug.WriteLine".
Badgerspot

4
Trong Visual Studio 2017, nó vẫn là liên kết 'Đầu ra'.
HankCa

66

Trong Visual Studio 2017, bạn có thể xem kết quả từ trình khám phá thử nghiệm.

1) Trong phương pháp thử nghiệm của bạn, Console.WriteLine ("something");

2) Chạy thử nghiệm.

3) Trong cửa sổ Test Explorer, nhấp vào Phương pháp Kiểm tra Đạt.

4) Và nhấp vào liên kết "Đầu ra".

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

Và nhấp vào "Đầu ra", bạn có thể xem kết quả của Console.Writeline (). nhập mô tả hình ảnh ở đây


1
Thông minh. Visual Studio / C # không phải là tiêu chuẩn của tôi để phát triển, đây chỉ là tôi muốn! Cảm ơn vì đã đăng tải điều này.
matt32

10
Tôi đang sử dụng Phiên bản 2017 15.5.6 Bit O không thấy liên kết đầu ra.
Mike IT

1
Nó có phụ thuộc vào khung thử nghiệm nào đang được sử dụng không? Tôi đang sử dụng xUnit 2.4 trong dự án thử nghiệm .NET 4.6 và không có ngăn "Đầu ra chuẩn" nào xuất hiện. Kết quả từ Console.WriteLinecũng không hiển thị trong ngăn Đầu ra trong "Kiểm tra".
Qwertie

Đối với xUnit, câu trả lời của jonzim phù hợp với tôi, ngay cả trong một chuỗi khác được tạo ra bởi thử nghiệm.
Qwertie

1
Đối với những người không nhìn thấy liên kết "đầu ra". 1) Bạn nên chọn một phương pháp kiểm tra . 2) để cửa sổ Test Explorer lấp đầy cửa sổ VS theo chiều dọc nếu không liên kết đã bị ẩn và thanh cuộn quá nhỏ để có thể nhận thấy hoặc sử dụng.
Meow Cat 2012,

18

Nó phụ thuộc vào trình chạy thử nghiệm của bạn ... ví dụ: tôi đang sử dụng xUnit , vì vậy trong trường hợp đó là những gì bạn đang sử dụng, hãy làm theo các hướng dẫn sau:

https://xunit.github.io/docs/capturing-output.html

Phương pháp này nhóm đầu ra của bạn với từng bài kiểm tra đơn vị cụ thể.

using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
    private readonly ITestOutputHelper output;

    public MyTestClass(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void MyTest()
    {
        var temp = "my class!";
        output.WriteLine("This is output from {0}", temp);
    }
}

Có một phương pháp khác được liệt kê trong liên kết mà tôi đã cung cấp để ghi vào cửa sổ Đầu ra của bạn, nhưng tôi thích phương pháp trước hơn.


4

Tôi nghĩ rằng nó vẫn là thực tế.

Bạn có thể sử dụng gói NuGet này: Bitoxygen.Testing.Pane

Gọi phương thức WriteLine tùy chỉnh từ thư viện này. Nó tạo một ngăn Kiểm tra bên trong cửa sổ Đầu ra và luôn đặt các thông báo ở đó (trong mỗi lần kiểm tra, nó chạy độc lập với các cờ DEBUG và TRACE).

Để dễ dàng theo dõi hơn, tôi có thể khuyên bạn nên tạo một lớp cơ sở:

[TestClass]
public abstract class BaseTest
{
    #region Properties
    public TestContext TestContext { get; set; }

    public string Class
    {
        get { return this.TestContext.FullyQualifiedTestClassName; }
    }
    public string Method
    {
        get { return this.TestContext.TestName; }
    }
    #endregion

    #region Methods
    protected virtual void Trace(string message)
    {
        System.Diagnostics.Trace.WriteLine(message);

        Output.Testing.Trace.WriteLine(message);
    }
    #endregion
}

[TestClass]
public class SomeTest : BaseTest
{
    [TestMethod]
    public void SomeTest1()
    {
        this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
    }
}

1
Điều kỳ diệu nằm ở: Output.Testing.Trace.WriteLine (message); với BitOxygen.
Bimal Poudel

Không làm việc với phiên bản hiện tại Visual Studio bạn nhận được một lỗiCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
Bảng điều khiển

@Console Có, nó cần một số hỗ trợ, nhưng tôi không chắc liệu cộng đồng có thú vị với cách xuất này hay không. xUnit có OutputHandler và VS có thể hiển thị kết quả của nó.
Maxim

1

Hãy thử sử dụng:

Console.WriteLine()

Lệnh gọi tới Debug.WriteLinesẽ chỉ được thực hiện khi DEBUG được xác định.

Các gợi ý khác cũng nên sử dụng: Trace.WriteLinenhưng tôi chưa thử cái này.

Ngoài ra còn có một tùy chọn (không chắc liệu Visual Studio 2008 có nó hay không), nhưng bạn vẫn có thể Sử dụng Debug.WriteLinekhi chạy thử nghiệm với Test With Debuggertùy chọn trong IDE.


1

Giải quyết bằng ví dụ sau:

public void CheckConsoleOutput()
{
    Console.WriteLine("Hello, World!");
    Trace.WriteLine("Trace Trace the World");
    Debug.WriteLine("Debug Debug World");
    Assert.IsTrue(true);
}

Sau khi chạy thử nghiệm này, trong 'Đã kiểm tra vượt qua', có tùy chọn để xem kết quả, sẽ hiển thị cửa sổ đầu ra.


1

Nó thực sự phụ thuộc vào người chạy thử nghiệm như @jonzim đã đề cập. Đối với NUnit 3, tôi phải sử dụng NUnit.Framework.TestContext.Progress.WriteLine()để chạy đầu ra trong cửa sổ Đầu ra của Visual Studio 2017.

NUnit mô tả cách thực hiện: tại đây

Theo hiểu biết của tôi, điều này xoay quanh việc bổ sung song song thực hiện thử nghiệm mà người chạy thử nghiệm đã nhận được.


0

Tôi không nhận được đầu ra khi cài đặt Kiểm tra / Cài đặt kiểm tra / Kiến trúc bộ xử lý mặc định của tôi và các cụm mà tham chiếu dự án kiểm tra của tôi không giống nhau. Nếu không thì Trace.Writeline () hoạt động tốt.


0

Console.WriteLine sẽ không hoạt động. Chỉ Debug.WriteLine () hoặc Trace.WriteLine () mới hoạt động ở chế độ gỡ lỗi.

Tôi làm như sau: bao gồm sử dụng System.Diagnostics trong mô-đun thử nghiệm. Sau đó, sử dụng Debug.WriteLine cho đầu ra của tôi, nhấp chuột phải vào bài kiểm tra , chọn Debug Selected Tests . Kết quả đầu ra bây giờ sẽ xuất hiện trong cửa sổ Output bên dưới. Tôi sử dụng Visual Studio 2017 vs 15.8.1, với khung kiểm tra đơn vị mặc định mà VS cung cấp.


0

Bạn có chắc mình đang chạy thử nghiệm đơn vị của mình trong Gỡ lỗi không? Debug.WriteLine sẽ không được gọi trong các bản phát hành.

Hai tùy chọn để thử là:

  • Trace.WriteLine (), được tích hợp vào các bản phát hành cũng như gỡ lỗi

  • Hoàn tác xác định GỢI Ý trong cài đặt bản dựng của bạn để kiểm tra đơn vị


0

Tôi đang sử dụng xUnit nên đây là những gì tôi sử dụng:

Debugger.Log(0, "1", input);

Tái bút: bạn cũng có thể sử dụng Debugger.Break();, vì vậy bạn có thể xem đăng nhập của mình out.


Đây là outgì?
Peter Mortensen

0

Một biến thể khác của nguyên nhân / giải pháp:

Vấn đề của tôi là tôi không nhận được đầu ra vì tôi đang viết tập kết quả từ lệnh gọi LINQ không đồng bộ tới bảng điều khiển trong một vòng lặp trong ngữ cảnh không đồng bộ:

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

Và do đó, bài kiểm tra không được ghi vào bảng điều khiển trước khi đối tượng bảng điều khiển được làm sạch bằng thời gian chạy (khi chỉ chạy một bài kiểm tra).

Giải pháp trước tiên là chuyển tập hợp kết quả thành danh sách, vì vậy tôi có thể sử dụng phiên bản không đồng bộ của forEach ():

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));

0

Trong VS 2019

  1. trong thanh menu VS chính, nhấp vào: View->Test Explorer
  2. Nhấp chuột phải vào phương pháp thử nghiệm của bạn trong Trình khám phá thử nghiệm -> Gỡ lỗi
  3. Nhấp vào additional outputliên kết như trong ảnh chụp màn hình bên dưới.

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

Bạn có thể dùng:

  • Debug.WriteLine
  • Console.WriteLine
  • TestContext.WriteLine

tất cả sẽ đăng nhập vào cửa sổ đầu ra bổ sung.


-1

Trace.WriteLinesẽ hoạt động với điều kiện bạn chọn đúng đầu ra (trình đơn thả xuống có nhãn "Hiển thị đầu ra từ" được tìm thấy trong cửa sổ Đầu ra ).

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.