2015-09-12 15 views
5

Trong khi di chuyển một số thử nghiệm từ JUnit sang TestNG, tôi đang gặp phải sự cố vì sự khác biệt trong cách các khung kiểm tra này xử lý các cá thể lớp Test của chúng.Khởi tạo và dọn sạch dữ liệu thử nghiệm cho các thử nghiệm song song trong TestNG

JUnit tạo phiên bản mới của lớp Kiểm tra cho từng phương pháp thử nghiệm. Vì vậy, một mẫu phổ biến tôi thấy là:

public class MyTest { 

    private Stream inputData; 

    @Before 
    public void setUp() { 
     // Set up some data in (non-static) instance fields 
     // This data is isolated per test 
     inputData = createInputDataStream(); 
    } 

    @Test 
    public void testStuff() { 
     // Use the data from the instance fields 
     doStuff(inputData); 
    } 

    @After 
    public void tearDown() { 
     // Clean up the data from the instance fields 
     closeInputDataStream(inputData); 
    } 
} 

Ngược lại, TestNG sử dụng một cá thể duy nhất của lớp Kiểm tra cho tất cả các phương pháp thử nghiệm. Vì vậy, mô hình trên không hoạt động! Vì dữ liệu được lưu trữ trong các trường mẫu, các giá trị không còn bị cô lập nữa. Điều này có thể gây ra dữ liệu ghi đè giữa kiểm tra nếu thực hiện song song được kích hoạt.

Vậy làm cách nào để tôi thực hiện việc này với TestNG? Có cách nào để lưu trữ dữ liệu được phân tách cho mỗi @BeforeMethod - @Test - @AfterMethod bộ dữ liệu không?

Tôi có thể tự làm tất cả 3 bước trong chính số @Test, nhưng điều đó sẽ yêu cầu thêm các khối vô hạn try...finally vào mọi thử nghiệm. Tôi cũng đã thử sử dụng ITestContext, nhưng nó cũng dường như được chia sẻ cho toàn bộ chạy thử nghiệm.

+1

'@ BeforeMethod' và '@AfterMethod 'được gọi xung quanh mỗi lệnh gọi' @ Test'; vì vậy đây là nghĩa vụ phải làm việc chính xác như bạn mô tả. Sự khác biệt duy nhất là bạn có thể ghi đè lên trạng thái lớp mỗi lần - thay vì tạo một cá thể mới. Bạn có nhận thấy bất kỳ hành vi bất ngờ nào với cách tiếp cận đó không? Hay bạn đang cố gắng chạy tất cả các bài kiểm tra trong lớp song song (tôi sợ điều đó là không thể)? –

+0

@CostiCiudatu Chủ yếu trong khi thực hiện song song - các giá trị đôi khi bị ghi đè giữa kiểm tra. – metacubed

+0

Nếu bạn muốn chạy các phương thức thử nghiệm trong lớp song song (''), không có cách nào để bảo vệ khỏi các điều kiện chủng tộc, vì bạn đang thay đổi trạng thái có thể thay đổi. –

Trả lời

1

Vâng, với TestNG bạn có sức mạnh cách nhiều hơn các biến địa phương mà bạn đã làm với JUnit VÀ DataProvider xử lý luồng của bạn, mỗi thử nghiệm đẳng cấp Ví dụ:

public class MyTest { 

private Stream inputData; 

@BeforeMethod 
public void setUp(Object[] args) { 
    inputData = (Data)args[0]; 
    inputData = normalizeDataBeforeTest(inputData); 
} 

@Test(dataProvider="testArgs") 
public void testStuff(Data inputDatax, Object a, Object b) { 
    doSomethingWith(a); 
    doSomethingWith(b); 
    doStuff(this.inputData); 
} 

@AfterMethod 
public void tearDown() { 
    // Clean up the data from the instance fields 
    closeInputDataStream(inputData); 
} 

.... 
@DataProvider 
public static Object[][] testArgs() { 
    // generate data here, 1 row per test thread 
    Object[][] testData; 
    for loop { 
     // add row of data to testData 
     // {{dataItem, obja, objb}, {dataItem, obja, objb}} etc. 
    } 
    return testData; 
} 
} 
Các vấn đề liên quan