2009-09-05 10 views
11

Tôi đang viết các bài kiểm tra đơn vị với NUnit và plugin TestDriven.NET. Tôi muốn cung cấp các tham số cho phương pháp thử nghiệm như sau:Làm cách nào để chỉ định các tham số phương pháp thử nghiệm với TestDriven.NET?

[TestFixture] 
public class MyTests 
{ 
    [Test] 
    public void TestLogin(string userName, string password) 
    { 
     // ... 
    } 

    ... 
} 

Như bạn có thể thấy, các thông số này là dữ liệu riêng tư, vì vậy tôi không muốn mã hóa chúng hoặc đặt chúng vào tệp. Thực ra tôi không muốn viết chúng ở bất cứ đâu, tôi muốn được nhắc mỗi khi tôi chạy thử nghiệm.

Khi tôi cố gắng chạy thử nghiệm này, tôi nhận được thông báo sau trong cửa sổ đầu ra:

TestCase 'MyProject.MyTests.TestLogin' không được thực hiện: Không có đối số được cung cấp

Vì vậy, câu hỏi của tôi là, làm cách nào để cung cấp các thông số này? Tôi mong đợi TestDriven.NET để hiển thị một dấu nhắc để tôi có thể nhập các giá trị, nhưng nó không ...

Xin lỗi nếu câu hỏi của tôi có vẻ ngu ngốc, câu trả lời có lẽ rất đơn giản, nhưng tôi không thể tìm thấy bất cứ điều gì hữu ích trên Google ...


EDIT: tôi chỉ tìm thấy một cách để làm điều đó, nhưng đó là một thủ thuật bẩn ...

[Test, TestCaseSource("PromptCredentials")] 
    public void TestLogin(string userName, string password) 
    { 
     // ... 
    } 

    static object[] PromptCredentials 
    { 
     get 
     { 
      string userName = Interaction.InputBox("Enter user name", "Test parameters", "", -1, -1); 
      string password = Interaction.InputBox("Enter password", "Test parameters", "", -1, -1); 
      return new object[] 
      { 
       new object[] { userName, password } 
      }; 
     } 
    } 

tôi vẫn quan tâm đến một giải pháp tốt hơn .. .

+3

Tôi nghĩ rằng nếu bạn làm điều này bạn sẽ gặp khó khăn khi chạy thử nghiệm một cách tự động trong một môi trường (Itegration Continuous) CI. – 7wp

+0

Bạn hoàn toàn đúng. Tuy nhiên, đó là một dự án cộng đồng nhỏ, vì vậy CI không thực sự là một vấn đề, ít nhất là bây giờ. –

Trả lời

2

Kiểm tra đơn vị thường không nên lấy bất kỳ thông số nào. Bạn tạo dữ liệu cần thiết trong bản thân kiểm tra.

  • Các giá trị kỳ vọng
  • Bạn gọi phương thức của bạn, bạn muốn kiểm tra thông qua các đối số cần thiết
  • Bạn so sánh kết quả với giá trị kỳ vọng và giá trị trả về từ phương pháp thử nghiệm của bạn

MS Các bài kiểm tra đơn vị không cho phép truyền các tham số cho các bài kiểm tra. Thay vào đó, bạn cần phải tạo Datadriven Unit tests. Hãy thử liên kết, nó có thể giúp bạn.

Như tôi đã đề cập. Tôi sẽ không tuyên bố đi qua các đối số để kiểm tra đơn vị chính nó thực hành tốt.


Cập nhật: Tôi đã :) trẻ. Thay vào đó hãy xem xét câu trả lời của Sarfraz về cách chuyển các tham số cho các thử nghiệm NUnit.

+1

Cảm ơn, nhưng một lần nữa, nó không giải quyết vấn đề của tôi ... Làm sao tôi phải chạy một thử nghiệm mà đòi hỏi phải có chứng chỉ? Tôi không muốn đặt tên người dùng và mật khẩu cá nhân của mình vào mã sẽ được chia sẻ với những người khác ... –

+0

Trong trường hợp này, hãy sử dụng thông tin xác thực giả. Loại logic nào là bài kiểm tra đơn vị của bạn phải bao gồm s.t. bạn cần xử lý chứng chỉ, v.v ...? – Juri

+0

Ồ, giờ tôi đã đọc bài đăng đã chỉnh sửa của bạn. Bạn không thể sử dụng một số thông tin xác thực giả. Người dùng test + pass có quyền truy cập vào những gì bạn cần để đạt được? Mặc dù tôi không hoàn toàn chắc chắn cho dù loại điều bạn muốn đạt được thực sự là những gì cần được kiểm tra bởi một bài kiểm tra đơn vị. Kiểm tra này: http://stackoverflow.com/questions/1257560/when-is-a-test-not-a-unit-test/1369982#1369982 – Juri

2

Tôi nghĩ bạn có thể giải quyết vấn đề này bằng cách sử dụng plugin RowTest cho NUnit được tìm thấy tại đây http://www.andreas-schlapsi.com/2008/01/29/rowtest-extension-120/

Bạn có thể tạo các thử nghiệm theo hướng dữ liệu đơn giản nơi dữ liệu thử được cung cấp bởi thuộc tính [Row]. Vì vậy, đây là ví dụ về thử nghiệm được chạy lặp đi lặp lại với các thông số khác nhau:

[TestFixture] 
public class RowTestSample 
{ 
[RowTest] 
[Row(1000, 10, 100.0000)] 
[Row(-1000, 10, -100.0000)] 
[Row(1000, 7, 142.85715)] 
[Row(1000, 0.00001, 100000000)] 
[Row(4195835, 3145729, 1.3338196)] 
public void DivisionTest(double numerator, double denominator, double result) 
{ 
    Assert.AreEqual(result, numerator/denominator, 0.00001); 
} 
} 
+2

Cảm ơn câu trả lời của bạn. Tôi nghĩ rằng plugin này được thực hiện lỗi thời bởi TestCaseAttribute mới trong NUnit 2.5 (http://nunit.org/index.php?p=testCase&r=2.5). Dù sao, nó không giải quyết vấn đề của tôi: Tôi không muốn mã hóa cứng các thông tin của tôi. Tôi muốn có lời nhắc nhập thủ công khi thử nghiệm chạy –

+0

Ah ok. Tôi đã hiểu nhầm. Rất vui được biết về TestCaseAttribute dù :) – 7wp

22

Sử dụng thuộc tính TestCase.

[TestCase("User1", "")] 
[TestCase("", "Pass123")] 
[TestCase("xxxxxx", "xxxxxx")] 
public void TestLogin(string userName, string password) 
{ 
    // ... 
} 
+2

+1. Điều này là tốt hơn nhiều so với câu trả lời được lựa chọn bằng cách xử lý tiêm phụ thuộc ngay trong các tham số TestCase() thay vì vẹt tắt "không có đối số trong phương pháp". Thật không may, tôi không nghĩ rằng MS Unit Test có bất cứ điều gì như thế này, chỉ cần Nunit – DeepSpace101

+2

Đây là câu trả lời đúng và ngắn. Nó không quan trọng nếu đây là một thực hành tốt hay xấu. –

+0

Vui lòng đánh dấu đây là câu trả lời đúng. Điều này trả lời câu hỏi và đối với tôi không phải là thực tế xấu để sử dụng params nói chung.Đối với mật khẩu tôi muốn ít nghiêng. – Rexxo

0

Tôi đồng ý với các câu trả lời khác mà các đối số đi qua có thể không phải là thực tiễn tốt nhất, nhưng không phải là thông tin đăng nhập mã hóa cứng hoặc địa chỉ máy chủ có thể thay đổi tại một số thời điểm.

Lấy cảm hứng từ giải pháp gợi ý trong câu hỏi, tôi chỉ đơn giản là đọc giao diện điều khiển đầu vào thay vì sử dụng hộp đầu vào. Các đối số được lưu trong một tập tin. Khi bắt đầu một thử nghiệm, tệp được chuyển hướng và được đọc từ một số hàm khởi tạo nên được gọi trước khi bất kỳ trường hợp thử nghiệm nào chạy.

nunit tests.dll < test.config 

Điều này tránh tương tác của người dùng và phải được chạy bởi bất kỳ tập lệnh tự động hóa nào. Nhược điểm là mật khẩu vẫn phải được lưu ở đâu đó, nhưng ít nhất nó có thể được lưu cục bộ trên máy xét nghiệm và dễ thay đổi.

Đây là cho một dự án, trong đó nổi trội tờ chứa các bài kiểm tra (không kiểm tra đơn vị theo định nghĩa) được sử dụng để cho người khác tạo ra trường hợp thử nghiệm cho một dự án phía máy chủ lớn hơn mà không thay đổi bất kỳ mã. Nó sẽ là xấu nếu tất cả các trường hợp thử nghiệm đã bị buộc phải trong một tờ excel khổng lồ duy nhất. Cũng không có CI, chỉ có nhiều môi trường thử nghiệm trên các máy chủ khác nhau.