Làm cách nào để chạy thử nghiệm NUnit song song?


83

Tôi đã có một bộ thử nghiệm thử nghiệm chấp nhận lớn (~ 10 giây mỗi lần thử nghiệm) được viết bằng NUnit. Tôi muốn tận dụng thực tế là tất cả các máy của tôi đều là hộp nhiều lõi. Lý tưởng nhất là tôi có thể chạy một bài kiểm tra cho mỗi lõi, độc lập với các bài kiểm tra khác.

Có PNUnit, nhưng nó được thiết kế để kiểm tra các vấn đề đồng bộ hóa luồng và những thứ tương tự, và tôi không thấy cách rõ ràng để thực hiện điều này.

Có công tắc / công cụ / tùy chọn nào mà tôi có thể sử dụng để chạy các bài kiểm tra song song không?


Ngay cả tôi cũng muốn biết thêm về điều này. @Billy ONeal vui lòng đăng câu trả lời nếu bạn tìm thấy câu trả lời.
PK

Bạn nói mười giây cho mỗi bài kiểm tra và lý tưởng là một bài kiểm tra đang chạy trên mỗi lõi. Các bài kiểm tra CPU có chuyên sâu không? Nếu không, có thể có nhiều hơn nữa chạy đồng thời.
Mattias Nilsson

@Mattias: Có, các bài kiểm tra CPU chuyên sâu.
Billy ONeal

Câu trả lời:


52

Nếu bạn muốn chạy thử nghiệm NUnit song song, có ít nhất 2 tùy chọn:

  • NCrunch cung cấp nó ra khỏi hộp (không thay đổi bất cứ điều gì, nhưng là một sản phẩm thương mại)
  • NUnit 3 Mời một parallelizable thuộc tính, mà có thể được sử dụng để biểu thị mà xét nghiệm có thể chạy song song

Câu trả lời này có vẻ sai khi đưa ra câu hỏi, một gợi ý hay hơn là câu trả lời đúng. Theo suy nghĩ của tôi, NCrunch cần sự ủng hộ của bạn và phải là câu trả lời hàng đầu vì nó có thể chạy các thử nghiệm (NUnit) đồng thời trong cùng một hoặc nhiều quy trình và trên một hoặc nhiều máy và sẽ làm như vậy từ VS hoặc từ một máy chủ bản dựng.
chillitom

2
@chillitom NCrunch đã được phát hành sau khi câu hỏi này được trả lời và là một lựa chọn tốt (vì điều này sẽ hoạt động hiệu quả, mặc dù nó quá đắt đối với một số người). Các tùy chọn khác trong tương lai có thể bao gồm NUnit 3, có thể cung cấp chạy thử nghiệm song song (theo github.com/nunit/dev/wiki/Roadmap ).
David_001

3
Mặc dù đây là câu trả lời hàng đầu, nhưng nó không còn chính xác như trước nữa. Nunit 3.0 được phát hành vào cuối năm 2015, hiện có thuộc tính Parallelizable. Tham khảo: github.com/nunit/nunit/wiki/Parallelizable-Attribute
pb.

36

NUnit phiên bản 3 sẽ hỗ trợ chạy thử nghiệm song song:

Thêm thuộc tính vào một lớp: [Parallelizable(ParallelScope.Self)]sẽ chạy các bài kiểm tra của bạn song song.

• ParallelScope.None chỉ ra rằng thử nghiệm có thể không được chạy song song với các thử nghiệm khác.

• ParallelScope.Self chỉ ra rằng bản thân thử nghiệm có thể được chạy song song với các thử nghiệm khác.

• ParallelScope.Children chỉ ra rằng các phần tử con của bài kiểm tra có thể được chạy song song với nhau.

• ParallelScope.Fixtures chỉ ra rằng các thiết bị có thể chạy song song với nhau.

NUnit Framework-Parallel-Test-Execution


10

Nếu dự án của bạn chứa nhiều DLL thử nghiệm, bạn có thể chạy chúng song song bằng cách sử dụng tập lệnh MSBuild này. Rõ ràng là bạn sẽ cần phải tinh chỉnh các đường dẫn để phù hợp với bố cục dự án của mình.

Để chạy với 8 lõi, hãy chạy với: c:\proj> msbuild /m:8 RunTests.xml

RunTests.xml

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="RunTestsInParallel" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <Nunit Condition=" '$(Nunit)' == '' ">$(MSBuildProjectDirectory)\..\tools\nunit-console-x86.exe</Nunit>
  </PropertyGroup>

  <!-- see http://mikefourie.wordpress.com/2010/12/04/running-targets-in-parallel-in-msbuild/ -->

  <Target Name="RunTestsInParallel">
    <ItemGroup> 
      <TestDlls Include="..\bin\Tests\$(Configuration)\*.Tests.dll" />
    </ItemGroup>

    <ItemGroup> 
      <TempProjects Include="$(MSBuildProjectFile)" > 
        <Properties>TestDllFile=%(TestDlls.FullPath)</Properties> 
      </TempProjects> 
    </ItemGroup> 

    <MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="RunOneTestDll" /> 
  </Target>

  <Target Name="RunOneTestDll"> 
    <Message Text="$(TestDllFile)" />
    <Exec Command="$(Nunit) /exclude=Integration $(TestDllFile)  /labels /xml:$(TestDllFile).results.xml"
      WorkingDirectory="$(MSBuildProjectDirectory)\..\bin\Tests\$(Configuration)" /> 
  </Target>

</Project>

Cập nhật Nếu bây giờ tôi đang trả lời câu hỏi này, tôi thực sự giới thiệu NCrunch và công cụ chạy thử nghiệm dòng lệnh của nó để có hiệu suất chạy thử nghiệm tối đa. Không có gì giống như nó và nó sẽ cách mạng hóa chu kỳ mã-kiểm tra-gỡ lỗi của bạn cùng một lúc.


1
Điều này đã giúp tôi giảm thời gian chạy các bài kiểm tra đơn vị từ 3 phút xuống 2 phút. Tôi đã thử nghiệm trên CPU 2 lõi.
Dmitrii Lobanov

4

Trong bài viết này có đề cập rằng để tăng tốc độ kiểm tra, người đăng chạy nhiều phiên bản NUnit với các tham số lệnh chỉ định những bài kiểm tra nào mà mỗi phiên bản sẽ chạy.

FTA:

Tôi gặp phải một vấn đề kỳ lạ.

Chúng tôi sử dụng nunit-console để chạy thử nghiệm trên máy chủ tích hợp liên tục của chúng tôi. Gần đây, chúng tôi đã chuyển từ Nunit 2.4.8 sang 2.5.5 và từ .Net 3.5 sang 4.0. Để tăng tốc độ thực thi kiểm tra, chúng tôi chạy song song nhiều phiên bản Nunit với các đối số dòng lệnh khác nhau

  • Chúng tôi có hai bản sao của các tập hợp thử nghiệm của chúng tôi và các mã nhị phân nunit trong thư mục A và B.
  • Trong thư mục A, chúng tôi thực thi

nunit-console-x86.exe Model.dll Kiểm tra.dll / loại trừ: MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

  • Trong thư mục B chúng tôi thực thi

nunit-console-x86.exe Model.dll Test.dll / include: MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

Nếu chúng ta thực hiện các lệnh theo trình tự thì cả hai đều chạy thành công. Nhưng nếu chúng ta thực hiện chúng song song thì chỉ có một thành công. Theo như tôi có thể nói đó là thứ đầu tiên tải các thiết bị thử nghiệm. Cái kia không thành công với thông báo "Không thể xác định vị trí cố định".

Vấn đề này đã được biết chưa? Tôi không thể tìm thấy bất kỳ điều gì liên quan trong danh sách lỗi trên bệ khởi động. BTW Máy chủ của chúng tôi chạy Windows Server 2008 64-bit. Tôi cũng có thể tái tạo sự cố trên Windows 7 64-bit.

Giả sử lỗi này đã được khắc phục hoặc bạn không chạy (các) phiên bản mới hơn của phần mềm được đề cập, bạn có thể sao chép kỹ thuật của chúng.

Cập nhật

TeamCity trông giống như một công cụ bạn có thể sử dụng để tự động chạy các bài kiểm tra NUnit. Họ có một trình khởi chạy NUnit được thảo luận ở đây có thể được sử dụng để khởi chạy nhiều phiên bản NUnit. Đây là một bài đăng trên blog thảo luận về việc kết hợp nhiều kết quả NUnit XML vào một tệp kết quả duy nhất.

Vì vậy, về mặt lý thuyết, bạn có thể để TeamCity tự động khởi chạy nhiều bài kiểm tra NUnit dựa trên cách bạn muốn chia nhỏ khối lượng công việc và sau đó hợp nhất kết quả thành một tệp duy nhất để xử lý bài kiểm tra.

Điều đó có đủ tự động cho nhu cầu của bạn không?


Đây là cùng một ý tưởng đã được đăng về các danh mục ... Tôi không muốn phải duy trì thời gian chạy tương đương hợp lý giữa các phiên bản ở đây. Tôi muốn viết Á hậu NUnit của riêng mình trước khi tôi làm điều này.
Billy ONeal

Theo như tôi biết NUnit không hỗ trợ điều này mà không có giải pháp thay thế, chẳng hạn như chạy nhiều phiên bản. Nếu bạn muốn, tôi đoán bạn có thể tạo một công cụ chia các bài kiểm tra thành N bộ và chạy N phiên bản NUnit tự động trong đó N là số bộ xử lý / lõi bạn có. Đó sẽ là cách duy nhất để có một số loại thử nghiệm song song tự động mà tôi có thể nghĩ đến với NUnit.
jeremczak

Tôi đã thêm một bản cập nhật thảo luận về công cụ tích hợp liên tục TeamCity và bao gồm một vài bài đăng về cách sử dụng công cụ đó để giải quyết nhu cầu tự động hóa của bạn.
precisionemczak

3

Chỉ vì PNUnit có thể thực hiện đồng bộ hóa bên trong mã thử nghiệm không có nghĩa là bạn thực sự phải sử dụng khía cạnh đó. Theo như tôi thấy thì không có gì ngăn cản bạn chỉ tạo ra một tập hợp và bỏ qua phần còn lại cho đến khi bạn cần.

BTW Tôi không có thời gian để đọc tất cả nguồn của chúng nhưng rất tò mò muốn kiểm tra lớp Barrier và đó là một bộ đếm khóa rất đơn giản. Nó chỉ đợi cho đến khi N luồng đi vào và sau đó gửi xung để tất cả chúng tiếp tục chạy cùng một lúc. Đó là tất cả những gì cần làm - nếu bạn không chạm vào nó, nó sẽ không cắn bạn.

Có thể hơi phản trực quan đối với sự phát triển theo luồng thông thường (các khóa thường được sử dụng để tuần tự hóa quyền truy cập - 1 x 1) nhưng đó là một sự chuyển hướng tinh thần :-)


3

Giờ đây, bạn có thể sử dụng NCrunch để song song hóa các bài kiểm tra đơn vị của mình và thậm chí bạn có thể định cấu hình số lượng lõi nên được sử dụng bởi NCrunch và số lõi nên được sử dụng bởi Visual Studio.

cộng với việc bạn nhận được thử nghiệm liên tục như một phần thưởng :)


3
NCrunch rất tuyệt khi bạn đang sử dụng nó trong Visual Studio, nhưng nó không hữu ích khi bạn đang cố gắng song song các thử nghiệm trên máy chủ xây dựng của mình.
Paccc

3
NCrunch hiện có sẵn một công cụ dòng lệnh hoạt động thực sự độc đáo trên các máy chủ xây dựng.
chillitom

3

Để thay thế cho việc thêm thuộc tính Parallelizable vào mọi lớp thử nghiệm:

Thêm điều này vào lớp AssemblyInfo.cs của dự án thử nghiệm cho nunit3 trở lên:

// Make all tests in the test assembly run in parallel
[assembly: Parallelizable(ParallelScope.Fixtures)]

2

Nó sẽ là một chút hack, nhưng bạn có thể chia các bài kiểm tra đơn vị thành một số loại . Sau đó, khởi động một phiên bản NUnit mới cho mỗi danh mục.

Chỉnh sửa: Có vẻ như họ đã thêm tùy chọn a / process vào ứng dụng bảng điều khiển. Trợ giúp dòng lệnh cho biết đây là "Mô hình quy trình cho các thử nghiệm: Đơn, Riêng biệt, Nhiều". Người chạy thử cũng có tính năng này.

Chỉnh sửa 2: Thật không may, mặc dù nó tạo ra các quy trình riêng biệt cho từng hợp ngữ, tùy chọn cách ly quy trình (/ quy trình từ dòng lệnh) chạy các tác nhân tại một thời điểm.


2

Vì dự án chưa được đề cập ở đây, tôi muốn giới thiệu NUnit.Multicore . Tôi chưa tự mình thử dự án, nhưng có vẻ như nó có một cách tiếp cận thú vị đối với vấn đề thử nghiệm song song với NUnit.


2

Bạn có thể thử công cụ nhỏ của tôi TBox hoặc an ủi song song Runner hoặc thậm chí cắm để làm calulations phân phối, mà cũng có thể chạy thử nghiệm đơn vị trên các thiết lập của máy tính SkyNet

TBox được tạo ra để đơn giản hóa công việc với các giải pháp lớn, chứa nhiều dự án. Nó hỗ trợ nhiều plugin và một trong số chúng cung cấp khả năng chạy thử nghiệm NUnit song song. Plugin này không yêu cầu bất kỳ thay đổi nào đối với các thử nghiệm hiện có của bạn.

Ngoài ra nó hỗ trợ:

  • Sao chép thư mục với kiểm tra đơn vị (nếu kiểm tra của bạn thay đổi dữ liệu cục bộ),

  • Đồng bộ hóa các bài kiểm tra (ví dụ: nếu các bài kiểm tra của bạn trên testfixtureteardown giết chết tất cả các máy chủ nhà phát triển hoặc công cụ chromerunner cho qunit)

  • chế độ x86 và đặc quyền Quản trị viên để chạy thử nghiệm

  • Chạy hàng loạt - bạn có thể chạy thử nghiệm cho nhiều tổ hợp song song

  • Ngay cả đối với chạy luồng đơn, hoạt động nhanh hơn trình chạy nunit chuẩn, nếu bạn có nhiều thử nghiệm nhỏ.

Ngoài ra công cụ này hỗ trợ chạy thử nghiệm dòng lệnh (chạy song song) và bạn có thể sử dụng nó với tích hợp liên tục.


Nếu bạn có liên kết với sản phẩm này, vui lòng tiết lộ điều này. Bạn đã đăng nhiều thứ chỉ đến điều này.
Brad Larson

Chắc chắn, TBox - là công cụ của riêng tôi. Tôi đã viết nó trong thời gian rảnh một mình. Nếu ở đây nói về các công cụ miễn phí là không tốt, tôi sẽ xóa câu trả lời này, không vấn đề gì đâu :)
Alex H

Chúng tôi chỉ muốn mọi người hiểu rõ về sản phẩm mà họ tham gia. Nếu bạn tiết lộ đầy đủ rằng đó là của bạn, tại sao lại thích hợp để giải quyết vấn đề mà câu hỏi đặt ra và không quảng bá nó quá mạnh mẽ, câu trả lời của bạn nên được chấp nhận ở đây.
Brad Larson

@brad Đây là mã nguồn mở trên Codeplex, không rõ tại sao lại có sự cố ở đây.
dvallejo

@DanVallejo - Là một dự án nguồn mở là lý do tại sao điều này không bị cộng đồng xóa khi đăng. Ở đó, chúng tôi có thêm chút thời gian, nhưng chúng tôi vẫn yêu cầu bạn tiết lộ mối quan hệ của mình với dự án để mọi người có thể hiểu bối cảnh đằng sau đề xuất của bạn. Alex đã làm như vậy ở đây, vì vậy câu trả lời của anh ấy hoàn toàn ổn như bây giờ.
Brad Larson


1

Tôi đã sử dụng thành công NUnit 3.0.0 beta-4 để chạy thử nghiệm song song

  • Chạy trên máy chủ xây dựng
  • Chạy thử nghiệm Selenium
  • Có hỗ trợ Visual Studio
  • chưa hỗ trợ Resharper

Cảm ơn câu trả lời đồng nghiệp .

Gotchas:

  • Thuộc tính Parallelizable không được kế thừa, vì vậy nó phải được chỉ định trên lớp thử nghiệm.

1
NUnit 3.0 hiện đã
Ralph Willgoss

0

Bạn có thể sử dụng lệnh PowerShell sau (đối với NUnit3, đối với tên người chạy thay đổi NUnit2):

PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique)

Lệnh đã trình bày chạy tất cả các cụm kiểm tra trong một phiên bản nunit duy nhất, cho phép tận dụng quá trình chạy kiểm tra song song được tích hợp sẵn của động cơ .

Nhận xét

  1. Hãy nhớ tinh chỉnh mẫu tìm kiếm thư mục. Ví dụ đã cho chỉ chạy các hội đồng kết thúc bằng .Tests.dllvà bên trong các \bin\Debugthư mục.

  2. Hãy lưu ý về Uniqueviệc lọc - bạn có thể không muốn có nó.

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.