2010-10-28 23 views
14

Tôi biết các bài kiểm tra đơn vị kiểm tra ms thường xuyên có thể được song song trên một máy đa lõi (với sự cẩn thận của khóa học) bằng cách xác định thuộc tính parallelTestCount trong tệp .testresults trong giải pháp kiểm tra. Như thế này,Làm cách nào để song song một thử nghiệm đơn vị Theo hướng dữ liệu trong Visual Studio 2010?

<Execution parallelTestCount="1"> 
    <TestTypeSpecific /> 
    <AgentRule name="Execution Agents"></AgentRule> 
</Execution> 

thêm tại: http://blogs.msdn.com/b/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx

Tuy nhiên, tôi có một bài kiểm tra dữ liệu-driven, một cái gì đó như thế này, đây chỉ là một thử nghiệm, nhưng đầu vào được lấy từ một csv và chạy 1000 bản ghi qua số cùng một thử nghiệm.

[DeploymentItem("InputDataRows.csv"), Timeout(37800000), DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\InputDataRow.csv", "InputDataRow#csv", DataAccessMethod.Sequential)]     
[TestMethod] 
public void RunProcessing() 
{ 
    int userId = Convert.ToInt32(TestContext.DataRow[0].ToString()); 
    int connId = Convert.ToInt32(TestContext.DataRow[1].ToString()); 
    string xml = TestHelper.GetDataFromDb(userId, connId); 
    a = doStuffA(xml); 
    b = doStuffB(xml); 
    Assert.IsTrue(a == b); 
} 

Vì đây là quá trình chậm, tôi đang xem xét song song kiểm tra đơn vị này.

Sequential enum trên thuộc tính chỉ là cách nó truy cập dữ liệu, tùy chọn khác là ngẫu nhiên, vẫn còn nối tiếp và không song song.

+0

Bạn đang sử dụng ngôn ngữ nào? C#? –

+0

C#, vâng, ofcourse! – Vin

+0

Bạn đang sử dụng phiên bản .Net nào? Ngoài ra, bạn có thể cung cấp một số chi tiết về cách TestContext đang được thiết lập không? –

Trả lời

-1

Như tôi biết: các hàng dữ liệu riêng lẻ trong thử nghiệm KHÔNG chạy song song. Nhưng nếu bạn có nhiều bài kiểm tra đơn vị, chúng chạy song song.

0

Để song song kiểm tra đơn vị này, bạn sẽ cần doStuffA()doStuffB() để có thể hoạt động trên một tập hợp con dữ liệu (ví dụ: một đoạn hoặc thậm chí một hàng duy nhất của csv tại một thời điểm). Nếu bạn có thể cấu trúc lại các phương thức của bạn để hoạt động theo cách này, bạn có thể sử dụng các tác vụ hoặc một vòng lặp foreach song song để kiểm tra này thực hiện song song. Giả sử các phương pháp của bạn đã được cấu trúc lại để xử lý một hàng của csv, bạn có thể làm một cái gì đó như thế này:

int userId = Convert.ToInt32(TestContext.DataRow[0].ToString()); 
int connId = Convert.ToInt32(TestContext.DataRow[1].ToString()); 
string xml = TestHelper.GetDataFromDb(userId, connId); 
var rows = xml.Split('\n'); 

Parallel.ForEach(rows, (row) => 
{ 
    var a = doStuffOnRowA(row); 
    var b = doStuffOnRowB(row); 
    Assert.AreEqual(a, b); 
}); 
0

Điều này có vẻ phức tạp nhưng nghe tôi nói. Có giới hạn trong MSTest rằng bạn không thể chạy thử nghiệm theo hướng dữ liệu song song. Những gì tôi đã làm trong quá khứ để giải quyết vấn đề này là tạo "công cụ tùy chỉnh" trong studio trực quan.

https://msdn.microsoft.com/en-us/library/bb166508.aspx

HOẶC

https://msdn.microsoft.com/en-us/library/bb166817.aspx

Các công cụ tùy chỉnh mà chúng tôi tạo ra đã làm như sau:

  1. chia ra csv thành nhiều file csv với chỉ một hàng mỗi.
  2. Tạo thử nghiệm riêng lẻ cho từng csv mới được tạo.

Khi các thử nghiệm này được tạo, chúng tôi đặt các thuộc tính thử nghiệm cụ thể vào chúng, vì vậy chúng tôi có thể chỉ định chỉ chạy thử nghiệm với thuộc tính đó.

Điều này nghe có vẻ giống như trên đầu, nhưng nếu bạn làm một công việc tốt xây dựng công cụ tùy chỉnh, nó thực sự là một quá trình rất trơn tru.

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