2011-09-26 25 views
15
@DataPoints public static final Integer[] input1={1,2}; 
@Theory 
@Test 
public void test1(int input1){ 

} 

@DataPoints public static final Integer[] input2={3,4}; 
@Theory 
@Test 
public void test2(int input2){ 

} 

Tôi muốn test1 đó chạy với đầu vào bộ dữ liệu1 - {1,2} và test2 chạy với input2 - {3,4}. Nhưng hiện tại, mỗi thử nghiệm chạy với cả hai tập dữ liệu {1,2,3,4}. Cách liên kết @DataPoints cụ thể với @Theorys cụ thểLàm thế nào để đính kèm một DataPoint với một Lý thuyết?

Trả lời

22

Điểm dữ liệu áp dụng cho lớp học. Nếu bạn có một phương thức @Theory lấy một int, và bạn có một DataPoint là một mảng ints, thì nó sẽ được gọi với int.

@RunWith(Theories.class) 
public class TheoryTest { 
    @DataPoint public static int input1 = 45; 
    @DataPoint public static int input2 = 46; 
    @DataPoints public static String[] inputs = new String[] { "foobar", "barbar" }; 

    @Theory public void testString1(String input) { 
     System.out.println("testString1 input=" + input); 
    } 

    @Theory public void testString2(String input) { 
     System.out.println("testString2 input=" + input); 
    } 

    @Theory public void test1(int input) { 
     System.out.println("test1 input=" + input); 
    } 

    @Theory public void test2(int input) { 
     System.out.println("test2 input=" + input); 
    } 
} 

này gọi test1 với 45 & 46, và test2 với 45 & 46. Nó kêu gọi testString1 với "foobar" và "Barbar" và testString2 với "foobar" và "Barbar".

Nếu bạn thực sự muốn sử dụng bộ dữ liệu khác nhau cho các lý thuyết khác nhau, bạn có thể quấn các dữ liệu trong một lớp học riêng:

@RunWith(Theories.class) 
public class TheoryTest { 
    public static class I1 { int i; public I1(int i) { this.i = i;} } 
    public static class I2 { int i; public I2(int i) { this.i = i;} } 

    @DataPoint public static I1 input1 = new I1(45); 
    @DataPoint public static I2 input2 = new I2(46); 

    @Theory 
    public void test1(I1 input) { 
     System.out.println("test1 input=" + input.i); 
    } 

    @Theory 
    public void test2(I2 input) { 
     System.out.println("test2 input=" + input.i); 
    } 
} 

này gọi test1 với 45 và test2 với 46. Công trình này, nhưng trong tôi ý kiến, nó che khuất mã, và nó có thể là một giải pháp tốt hơn để chia lớp Test thành hai lớp.

+0

@Mathew Cảm ơn bạn đã trả lời. Vì vậy, không có tính năng ràng buộc như vậy. Sẽ sử dụng gói trong lớp tư nhân trong thời gian này. Nhưng nó vẫn không thanh lịch. Tôi vẫn không hiểu tại sao DataPoints được gắn vào lớp học? Chúng có ý nghĩa tốt hơn ở cấp độ phương pháp. –

+0

Ý tưởng là bạn có một số điểm dữ liệu và bạn có thể thử nghiệm một số lý thuyết: vì bạn cần một số phương pháp thử nghiệm. Nếu bạn hài lòng với câu trả lời, bạn có thể chấp nhận nó không? –

+0

+1 để tách lớp Bài kiểm tra thành hai lớp. Nếu test1 và test2 cần các tập dữ liệu khác nhau để vượt qua và có ý nghĩa, thì về cơ bản chúng đang thử nghiệm các hành vi khác nhau và có thể tách biệt một cách hợp lý. –

1

Một số tài liệu tham khảo tôi đã thấy nói về việc sử dụng các thử nghiệm cho các giá trị cụ thể và lý thuyết để xác minh hành vi. Ví dụ, nếu bạn có một lớp có phương thức cộng và trừ từ một thuộc tính, phép thử sẽ xác minh tính chính xác của kết quả (ví dụ, 1 + 3 trả về 4) trong khi lý thuyết có thể xác minh rằng, cho các giá trị datapoint (x1) , y1), (x2, y2), x + yy luôn bằng x, x-y + y luôn bằng x, x * y/y luôn bằng x, v.v. Theo cách này, kết quả của lý thuyết không được kết hợp chặt chẽ với dữ liệu. Với lý thuyết, bạn cũng có thể lọc ra các trường hợp như y == 0; chúng không được tính là thất bại. Tóm lại: bạn có thể sử dụng cả hai. Một bài báo tốt là: http://web.archive.org/web/20110608210825/http://shareandenjoy.saff.net/tdd-specifications.pdf

21

Với JUnit 4.12 (không chắc chắn khi nó được giới thiệu) người ta có thể đặt tên cho datapoints và gán chúng với các thông số (i học nó từ http://farenda.com/junit/junit-theories-with-datapoints/):

@RunWith(Theories.class) 
public class TheoriesAndDataPointsTest { 
    @DataPoints("a values") 
    public static int[] aValues() { 
     return new int[]{1, 2}; 
    } 

    @DataPoints("b values") 
    public static int[] bValues() { 
     return new int[]{3, 4}; 
    } 

    @Theory 
    public void theoryForA(@FromDataPoints("a values") int a) { 
     System.out.printf("TheoryForA called with a = %d\n", a); 
    } 

    @Theory 
    public void theoryForB(@FromDataPoints("b values") int a) { 
     System.out.printf("TheoryForB called with b = %d\n", a); 
    } 
} 

Đầu ra:

TheoryForA called with a = 1 
TheoryForA called with a = 2 
TheoryForB called with b = 3 
TheoryForB called with b = 4 
+1

Đây phải là câu trả lời được chấp nhận. – Chris311

+0

@ Chris311, tuy nhiên, chỉ dành cho những người có thể sử dụng JUnit mới nhất. Thật không may cho chúng tôi bị mắc kẹt với các phiên bản cũ hơn của IDE, nhật thực lên đến ít nhất một điểm nhất định (và tôi chắc chắn nó vẫn là) khẳng định bằng cách sử dụng phiên bản đóng gói sẵn của thư viện JUnit của riêng nó, có thể không hỗ trợ điều này. –

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