2011-07-12 25 views
5

Xin chào Tất cả tôi có câu hỏi liên quan đến NUnit Extension (2.5.10). Điều tôi đang cố gắng thực hiện là viết một số thông tin thử nghiệm bổ sung vào cơ sở dữ liệu . Tôi đã tạo phần mở rộng NUnit bằng cách sử dụng Event Listeners. Vấn đề tôi đang gặp phải là công khai void phương pháp TestFinished (TestResult result) đang được gọi hai lần tại thời gian chạy là . Và mã của tôi mà viết vào cơ sở dữ liệu là trong phương pháp này và lá tôi với các mục trùng lặp trong cơ sở dữ liệu. Câu hỏi là: Đó có phải là hành vi mong đợi không? Tôi có thể làm điều gì đó về số không? Mã mở rộng bên dưới. Cảm ơn.Mở rộng NUnit

using System; 
using NUnit.Core; 
using NUnit.Core.Extensibility; 

namespace NuinitExtension 
{ 
[NUnitAddinAttribute(Type = ExtensionType.Core, 
        Name = "Database Addin", 
        Description = "Writes test results to the database.")] 
public class MyNunitExtension : IAddin, EventListener 
{ 
    public bool Install(IExtensionHost host) 
    { 
     IExtensionPoint listeners = host.GetExtensionPoint("EventListeners"); 
     if (listeners == null) 
      return false; 

     listeners.Install(this); 
     return true; 
    } 

    public void RunStarted(string name, int testCount){} 
    public void RunFinished(TestResult result){} 
    public void RunFinished(Exception exception){} 
    public void TestStarted(TestName testName){} 

    public void TestFinished(TestResult result) 
    { 
     // this is just sample data 
     SqlHelper.SqlConnectAndWRiteToDatabase("test", test", 
               2.0, DateTime.Now); 
    } 

    public void SuiteStarted(TestName testName){} 
    public void SuiteFinished(TestResult result){} 
    public void UnhandledException(Exception exception){} 
    public void TestOutput(TestOutput testOutput){} 
} 

}

+0

tôi nghĩ rằng 'TestFinished' sẽ được gọi ít nhất một lần cho mỗi bài kiểm tra. Bạn chỉ đang chạy một thử nghiệm duy nhất? Nếu bạn là sau đó nó có thể là 'TestFinished' được gọi là một lần cho các vật cố định và một lần cho phương pháp thử nghiệm. Tôi đã không nhìn vào bên trong mã NUnit trong một thời gian dài vì vậy tôi không chắc chắn 100%. Bạn có thể biết bằng cách kiểm tra các thuộc tính trên 'TestResult' được truyền vào. –

+0

Cảm ơn Mike, tôi đang chạy nhiều kiểm tra và tôi muốn ghi lại mọi thử nghiệm, nhưng chỉ một lần, thay vào đó tôi nhận được hai mục cho mỗi bài kiểm tra. Và tôi nghĩ rằng phương pháp đặc biệt này sẽ chỉ chạy cho mỗi thử nghiệm một lần và SuiteStarted sẽ chạy cho mỗi TestFixture. – Igor

+0

Các suite khác nhau. Có một cách rõ ràng để thiết lập một Suite. Tôi không bao giờ sử dụng nó vì vậy tôi không chắc chắn như thế nào nữa. 'TestResult' theo sau mẫu Composite. Vì vậy, nó có thể là kết quả của một thử nghiệm hoặc một trận đấu hoặc chạy thử nghiệm toàn bộ. Tôi ngạc nhiên rằng nó được gọi hai lần cho một thử nghiệm duy nhất. Có thể nó đã được cài đặt hai lần? –

Trả lời

1

tôi đã quản lý để khắc phục vấn đề bằng cách tháo rời lắp ráp mở rộng tôi từ NUnit 2.5.10 \ bin \ thư mục net-2.0 \ addins. Hiện tại, mọi thứ hoạt động như mong đợi nhưng tôi không chắc chắn như thế nào. Tôi nghĩ rằng bạn phải có phần mở rộng/bổ sung bên trong thư mục addins. Tôi đang chạy thử nghiệm bằng cách mở một giải pháp thông qua NUnit.exe. Dự án mở rộng của tôi là một phần của giải pháp mà tôi đang thử nghiệm. Tôi cũng đã nêu vấn đề này với những người NUnit và nhận được giải thích sau:

Rất có thể, phần bổ trợ của bạn đã được tải hai lần. Để làm cho nó dễ dàng hơn để kiểm tra các addins, NUnit tìm kiếm mỗi assembly thử nghiệm cho các addins được nạp, ngoài việc tìm kiếm thư mục addins. Thông thường, khi bạn tự tin rằng addin của bạn hoạt động, bạn nên loại bỏ nó khỏi hội đồng kiểm tra và cài đặt nó trong thư mục addins. Điều này làm cho nó có sẵn cho tất cả các thử nghiệm được chạy bằng cách sử dụng NUnit. OTOH, nếu bạn thực sự chỉ muốn addin để áp dụng cho một dự án nhất định, sau đó bạn có thể để nó trong hội đồng kiểm tra và không cài đặt nó như là một addin vĩnh viễn. http://groups.google.com/group/nunit-discuss/browse_thread/thread/c9329129fd803cb2/47672f15e7cc05d1#47672f15e7cc05d1

0

Không chắc chắn câu trả lời này có liên quan chặt chẽ nhưng có thể hữu ích.

Tôi đã có một vở kịch xung quanh với thư viện NUnit gần đây để đọc các bài kiểm tra NUnit để chúng có thể dễ dàng được chuyển sang khuôn khổ kiểm tra chấp nhận nội bộ của riêng chúng tôi.

Hóa ra chúng tôi có lẽ sẽ không gắn bó với điều này, nhưng nghĩ rằng nó có thể có ích để chia sẻ kinh nghiệm của tôi để tìm ra cách sử dụng mã NUnit:

Nó khác ở chỗ nó không được điều hành bởi NUnit giao diện điều khiển hoặc Gui Runner nhưng chỉ bằng ứng dụng giao diện điều khiển của riêng chúng tôi.

public class NUnitTestReader 
{ 
    private TestHarness _testHarness; 

    public void AddTestsTo(TestHarness testHarness) 
    { 
     _testHarness = testHarness; 
     var package = new TestPackage(Assembly.GetExecutingAssembly().Location){AutoBinPath = true}; 
     CoreExtensions.Host.InitializeService(); 
     var testSuiteBuilder = new TestSuiteBuilder(); 
     var suite = testSuiteBuilder.Build(package); 

     AddTestsFrom(suite); 
    } 

    private void AddTestsFrom(Test node) 
    { 
     if (!node.IsSuite) 
      AddTest(node); 
     else 
     { 
      foreach (Test test in node.Tests) 
       AddTestsFrom(test); 
     } 
    } 

    private void AddTest(Test node) 
    { 
     _testHarness.AddTest(new WrappedNUnitTest(node, TestFilter.Empty)); 
    } 
} 

Ở trên đọc NUnit kiểm tra từ lắp ráp hiện tại kết thúc chúng lên rồi thêm chúng vào bộ phận thử nghiệm trong nhà của chúng tôi. Tôi chưa bao gồm các lớp này nhưng chúng không thực sự quan trọng để hiểu cách thức hoạt động của mã NUnit.

Thông tin thực sự hữu ích về thông tin ở đây là tĩnh đến "InitialiseService", điều này đã mất khá nhiều thời gian nhưng cần thiết để có được bộ đọc thử cơ bản được tải trong NUnit. Bạn cần phải cẩn thận một chút khi xem xét các thử nghiệm trong NUnit tốt như nó bao gồm các kiểm tra thất bại (mà tôi giả sử không làm việc vì số lượng các statics liên quan) - vì vậy những gì trông giống như tài liệu hữu ích thực sự gây hiểu nhầm.

Ngoài ra, bạn có thể chạy thử nghiệm bằng cách triển khai EventListener. Tôi đã quan tâm đến việc lập bản đồ từ một đến một giữa các bài kiểm tra của chúng tôi và các bài kiểm tra NUnit để mỗi bài kiểm tra được chạy trên chính nó.Để đạt được điều này, bạn chỉ cần thực hiện TestStarted và TestFinished làm logging:

public void TestStarted(TestName testName) 
    { 

    } 
    public void TestFinished(TestResult result) 
    { 
     string text; 
     if (result.IsFailure) 
      text = "Failure"; 
     else if (result.IsError) 
      text = "Error"; 
     else 
      return; 

     using (var block = CreateLogBlock(text)) 
     { 
      LogFailureTo(block); 
      block.LogString(result.Message); 
     } 
    } 

Có một vài vấn đề với cách tiếp cận này: Kế thừa các lớp cơ sở thử nghiệm từ hội đồng khác với các phương pháp thiết lập mà đại biểu cho những người thân trong lắp ráp hiện nay không được gọi. Nó cũng có vấn đề với các phương thức TestFixtureSetup chỉ được gọi trong NUnit khi TestSuites đang chạy (trái ngược với các phương thức chạy thử nghiệm của riêng chúng).

Những cả dường như là vấn đề với NUnit mặc dù nếu bạn không muốn xây dựng kiểm tra bọc cách cá nhân tôi nghĩ rằng bạn chỉ có thể đưa vào một cuộc gọi đến suite.Run với các thông số thích hợp và điều này sẽ khắc phục vấn đề sau