2009-09-23 51 views
14

Làm thế nào để bạn tạo các bài kiểm tra đơn vị trong F #? Tôi thường sử dụng phần UnitTest của Visual Studio với một thuộc tính [TestClass] và [TestMethod] và sử dụng Test View để chạy chúng. Tôi biết tôi chỉ có thể tạo một tập tin kịch bản và chạy chúng, nhưng tôi thích cách nó hiện đang được xử lý.Làm thế nào để xử lý các bài kiểm tra đơn vị trong F #?

+0

[Bài viết gần đây của tôi] (http://fsharpnews.blogspot.com/2011/01/testing-behaviour-driven-development.html) mô tả điều này và nhiều hơn nữa (thử nghiệm BDD từ F #). –

+0

Đây là nơi bắt đầu: http://bit.ly/1JhEbA7 –

Trả lời

9

Tôi muốn sử dụng FsUnit hoặc FsTest để viết bài kiểm tra trong F #, nó cảm thấy tự nhiên hơn so OO xUnit thử nghiệm phong cách.

EDIT 2014: Bây giờ tôi xem FsUnit/FsTest là đường cú pháp chủ yếu là vô dụng. Và "tự nhiên hơn OO" không có nghĩa là hoàn toàn bất cứ điều gì. Một vài tháng trước, tôi đã viết những suy nghĩ hiện tại của mình về thử nghiệm here (Tôi khuyên bạn nên đọc toàn bộ chuỗi).

10

Khám phá fscheck. Đó là một cổng Quickcheck của Haskell. Fscheck cho phép bạn chỉ định các thuộc tính mà một hàm phải thỏa mãn, nó sẽ kiểm tra đối với một "số lượng lớn các trường hợp được tạo ngẫu nhiên".

Đó là điều bạn không thể dễ dàng thực hiện với ngôn ngữ bắt buộc như C#.

+0

Hãy xem qua Pex: http://research.microsoft.com/en-us/projects/Pex/ –

+0

@Mauricio: Tôi đồng ý rằng điều đó có thể để làm những gì FsCheck thực hiện (tạo ngẫu nhiên các trường hợp thử nghiệm) trong một thiết lập OO (một ví dụ khác: RANDOOP). Có lẽ một ngày nào đó chúng ta sẽ có một ngôn ngữ đặc tả (trông đẹp hơn nhiều trong một thiết lập chức năng theo ý kiến ​​rất thiên vị của tôi) có thể tạo ra cả hai trường hợp được tạo ngẫu nhiên và bao gồm các trường hợp như Pex. –

+0

Bây giờ FsCheck có giao diện C# để bạn có thể sử dụng các tính năng quan trọng nhất của FsCheck trong C#. –

1

Hãy thử XUnit.net

+0

Đồng ý. (Chỉ?) xUnit.NET có thể chạy các trường hợp thử nghiệm trong các phương thức tĩnh, vì vậy nếu bạn muốn ở lại trong các khung công tác kiểm thử .NET chính thống, đó là một khung công tác ít tốn kém nhất để sử dụng. –

+0

MbUnit cũng có thể thực hiện điều này quá –

1

Kể từ phiên bản 2.5, NUnit cho phép bạn sử dụng static members as tests. Ngoài ra, lớp TestFixtureAttribute cấp lớp là only necessary for generic or classes with non-default constructors. NUnit cũng có backward-compatible convention rằng một thành viên thử nghiệm có thể bắt đầu bằng từ "test" thay vì sử dụng TestAttribute, vì vậy bạn gần như có thể viết F # thành ngữ với NUnit> 2.5.

Cập nhật Bạn có thể thấy một số ví dụ kiểm tra mà không có sự TestFixtureAttribute trong Cashel library. Tôi tiếp tục sử dụng TestAttribute vì nó xuất hiện vài người thử nghiệm kiểm tra chính xác các bài kiểm tra khi nó không có mặt, do đó một phần của bài NUnit có thể không chính xác hoặc ít gây hiểu lầm nhất.

+0

Ryan, bạn có muốn xây dựng một ví dụ thử nghiệm trong F # không? Hoặc một liên kết đến một trang web cho thấy các xét nghiệm đơn vị F # không có TestAttribute hoặc TestFixtureAtrribute? –

+0

@David Tôi đã thêm một liên kết đến các bài kiểm tra của tôi cho Cashel. –

2

Bạn có thể muốn thử NaturalSpec. Đó là một F # UnitTest-Framework trên đầu trang của NUnit.

3

tôi sử dụng một sự kết hợp của xUnit.net, TestDriven.Net (Visual Studio Add-in cho chạy thử nghiệm, miễn phí cho "sinh viên, các nhà phát triển mã nguồn mở và sử dụng thử nghiệm"), và thư viện mã nguồn mở riêng Unquote của tôi (mà cũng làm việc với NUnit và bất kỳ khung xác nhận dựa trên ngoại lệ nào khác). Điều này đã làm việc ra tuyệt vời và bắt đầu thực sự dễ dàng:

  1. Tải về và cài đặt TestDriven.Net
  2. Tải xUnit.net, giải nén để bất kỳ vị trí và chạy xunit.installer.exe để tích hợp với TestDriven.Net
  3. Tải unquote, giải nén để bất kỳ vị trí
  4. Tạo một dự án trong giải pháp của bạn cho đơn vị kiểm tra
  5. Thêm tài liệu tham khảo để xunit.dll và Unquote.dll (từ tải đã được giải nén) trong dự án thử nghiệm đơn vị của bạn
  6. Sau đây là một ví dụ đơn giản về tệp .fs trong dự án thử nghiệm đơn vị chứa các bài kiểm tra đơn vị kiểu xUnit.net/Unquote.

    module Tests 
    open Swensen.Unquote 
    open Xunit 
    
    [<Fact>] 
    let ``description of first unit test``() = 
        test <@ (11 + 3)/2 = String.length ("hello world".Substring(4, 5)) @> 
    
    [<Fact>] 
    let ``description of second unit test``() = 
        let x = List.rev [1;2;3;4] 
        x =? [4;3;1;2] 
    
  7. Chạy tất cả các bài kiểm tra đơn vị trong dự án bằng cách kích chuột phải vào dự án trong Solution Explorer và chọn Run Test (s).Cả hai bài kiểm tra ví dụ trước sẽ thất bại với những sản phẩm sau in vào cửa sổ Visual Studio Output:

    ------ Test started: Assembly: Tests.dll ------ 
    
    Test 'Tests.description of second unit test' failed: 
    
    [4; 3; 2; 1] = [4; 3; 1; 2] 
    false 
    
        C:\Solution\Project\Tests.fs(12,0): at Tests.description of second unit test() 
    
    Test 'Tests.description of first unit test' failed: 
    
    (11 + 3)/2 = String.length ("hello world".Substring(4, 5)) 
    14/2 = String.length "o wor" 
    7 = 5 
    false 
    
        C:\Solution\Project\Tests.fs(7,0): at Tests.description of first unit test() 
    
    0 passed, 2 failed, 0 skipped, took 1.09 seconds (xUnit.net 1.7.0 build 1540). 
    
7

Trong VS2013 bạn có thể sử dụng dưới đây.

open Microsoft.VisualStudio.TestTools.UnitTesting 
[<TestClass>] 
type testrun() = 
    [<TestInitialize>] 
    member x.setup() = 
     //your setup code 

    [<TestMethod>] 
    member x.yourTestName() = 
     //your test code 

Gợi ý: Nếu bạn đang tìm kiếm thử nghiệm đơn vị giao diện người dùng thì bạn có thể sử dụng thiết lập này với Canopy.

+1

Đây phải là câu trả lời được chấp nhận. Điều này sử dụng chức năng kiểm tra đơn vị tích hợp sẵn. Ngoài ra (và không rõ ràng), phương pháp này yêu cầu thêm một tham chiếu đến Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll. – wizulus

+0

@alancnet chỉ được tích hợp nếu bạn đang sử dụng Visual Studio. – Yawar

Các vấn đề liên quan