2010-06-29 36 views
18

Tôi vừa phát hiện ra khi tạo một số thử nghiệm CRUD mà bạn không thể đặt dữ liệu trong một bài kiểm tra và đọc nó trong một bài kiểm tra khác (dữ liệu được đặt về khởi tạo giữa mỗi bài kiểm tra).Truyền dữ liệu JUnit giữa các bài kiểm tra

Tất cả những gì tôi đang cố làm là (C) reate một đối tượng với một thử nghiệm, và (R) ead nó với tiếp theo. Liệu JUnit có một cách để làm điều này, hoặc là nó được mã hóa theo ý thức hệ thống sao cho các xét nghiệm không được phép phụ thuộc lẫn nhau?

+0

[Đây là một giải pháp tôi đã đưa ra và giải thích về những hạn chế của việc sử dụng các biến tĩnh] [1] [1]: http://stackoverflow.com/questions/17885221/how-to-save-non-static-properties-state-between-junit-test-methods-answer –

+0

@JacobKo liên kết của bạn dẫn đến trang không tìm thấy – OrwellHindenberg

Trả lời

15

Vâng, đối với các bài kiểm tra đơn vị, mục tiêu của bạn nên là kiểm tra đoạn mã nhỏ nhất bị cô lập, thường là phương pháp theo phương pháp. Vì vậy, testCreate() là một trường hợp thử nghiệm và testRead() là một trường hợp khác. Tuy nhiên, không có gì ngăn bạn tạo ra một testCreateAndRead() để kiểm tra hai hàm cùng nhau. Nhưng sau đó nếu thử nghiệm thất bại, đơn vị mã nào thử nghiệm không thành công? Bạn không biết. Những loại thử nghiệm này giống như kiểm tra tích hợp, nên được xử lý khác nhau.

Nếu bạn thực sự muốn làm điều đó, bạn có thể tạo biến lớp tĩnh để lưu trữ đối tượng được tạo bởi testCreate(), sau đó sử dụng nó trong testRead().

Như tôi đã không có ý tưởng những gì phiên bản của Junit bạn nói về, tôi chỉ nhặt một cổ Junit 3.8:

Hoàn toàn xấu xí nhưng hoạt động:

public class Test extends TestCase{ 

    static String stuff; 

    public void testCreate(){ 
     stuff = "abc"; 
    } 

    public void testRead(){ 
     assertEquals(stuff, "abc"); 
    } 
} 
+0

Nó * là * kiểm tra tích hợp - duh, CRUD có nghĩa là truy cập cơ sở dữ liệu . – orbfish

+0

Nhân tiện, ý tưởng hay về biến tĩnh, nếu nó hoạt động. Tôi sẽ phải thử nó. – orbfish

+0

Điều đó có hiệu quả, cảm ơn! – orbfish

11

JUnit thúc đẩy kiểm tra độc lập. Một lựa chọn là đặt hai phép thử logic vào một phương thức @Test.

TestNG được tạo ra một phần để cho phép các loại phụ thuộc này giữa các thử nghiệm. Nó thực thi các khai báo cục bộ về các phụ thuộc kiểm thử - nó chạy các phép kiểm thử theo thứ tự hợp lệ và không chạy các kiểm tra phụ thuộc vào một phép thử không thành công. Xem http://testng.org/doc/documentation-main.html#dependent-methods để biết các ví dụ.

+0

Vì vậy, nó * là * ý thức hệ! Tôi đã lo sợ về nó. Tôi đã nghĩ, nghĩ lại, rằng có một số chú thích mới liên quan đến sự phụ thuộc lẫn nhau, nhưng có lẽ tôi đã đọc về TestNG. – orbfish

+0

Nó thực sự là lý tưởng cho các bài kiểm tra đơn vị để được độc lập ở cả tiểu bang và trật tự. JUnit hỗ trợ lý tưởng. TestNG hỗ trợ cả hai ngoại lệ lý tưởng và thực dụng. Cedric Beust, tác giả của TestNG, thảo luận các vấn đề chi tiết hơn trong các nguồn bên dưới. Ông đã xác nhận ý định của JUnit với Beck và Gamma, và tìm thấy những thiếu sót với cách làm việc xung quanh cách tiếp cận JUnit với các thành viên tĩnh. * Bài đăng trên blog của Beust năm 2004 http://beust.com/weblog/2004/02/08/junit-pain/ * Một số trang đầu tiên của cuốn sách của Beust "Thử nghiệm Java thế hệ tiếp theo: TestNG và khái niệm nâng cao", Addison -Wesley, 2008. –

+0

Tôi đồng ý với tất cả điều đó, đối với các bài kiểm tra đơn vị. Nhưng kiểm tra CRUD là truy cập cơ sở dữ liệu và do đó không phải kiểm tra đơn vị. Đó là một sự xấu hổ mà JUnit, mà là rất linh hoạt và phổ biến, nên được giới hạn trong bất kỳ cách nào mà hạn chế nó để kiểm tra đơn vị chỉ. – orbfish

3

Mất bao nhiêu thời gian xử lý? Nếu không nhiều, thì tại sao lại đổ mồ hôi. Chắc chắn bạn sẽ tạo ra một số đối tượng không cần thiết, nhưng chi phí này là bao nhiêu?

@Test 
void testCreateObject() { 
    Object obj = unit.createObject(); 
} 

@Test 
void testReadObject() { 
    Object obj = null; 
    try { 
     obj = unit.createObject(); // this duplicates tests aleady done 
    } catch (Exception cause) { 
     assumeNoException(cause); 
    } 
    unit.readObject(obj); 
} 
+0

Điểm tốt. Đó là nhiều hơn mà tôi phải suy nghĩ lên dữ liệu thử nghiệm để đảm bảo tính duy nhất trong 2 createObject() s, nhưng điều này có thể là con đường để đi. – orbfish

+1

Tôi đoán một phần của tôi chống lại việc viết cùng một mã "tạo" hai lần. Tôi đang quá DRY, methinks. – orbfish

+0

@orbfish Đây là DRY như bạn có thể nhận được mà không cần giới thiệu sự phụ thuộc giữa các thử nghiệm. @emory cuộc gọi đến 'unit.readObject' phải được thực hiện trong khối' try'. Bạn dựa vào nội dung của mệnh đề 'catch' để tránh' NullPointerException' hoặc một cái gì đó tương tự. – MauganRa

2

trong ví dụ cơ bản này, các biến được thay đổi trong các thử nghiệm A, và có thể được sử dụng trong các thử nghiệm B

public class BasicTest extends ActivityInstrumentationTestCase2 { 
    public BasicTest() throws ClassNotFoundException { 
     super(TARGET_PACKAGE_ID, launcherActivityClass);   
    } 

    public static class MyClass {  
     public static String myvar = null;    
     public void set(String s) { 
      myvar = s; 
     }    
     public String get() { 
      return myvar; 
     } 
    } 

    private MyClass sharedVar; 

    @Override 
    protected void setUp() throws Exception { 
     sharedVar = new MyClass(); 
    } 

    public void test_A() { 
     Log.d(S,"run A"); 
     sharedVar.set("blah"); 
    } 

    public void test_B() { 
     Log.d(S,"run B");  
     Log.i(S,"sharedVar is: " + sharedVar.get());   
    } 

} 

kết quả đầu ra là:

chạy Một

chạy B

sharedVar là: blah

+0

Ví dụ của bạn không chứa 'chú thích @Test'. Tôi đã thử mã của bạn bằng cách thêm '@Test' và không có may mắn. Bạn đã thử cái này chưa? Tôi đã được ấn tượng rằng một bài kiểm tra JUnit phải chứa ít nhất một chú thích như vậy. – OrwellHindenberg

1

JUnit là thử nghiệm độc lập. Nhưng, Nếu bạn không có cách nào, bạn có thể sử dụng "tĩnh" dụ để lưu trữ nó.

static String storage; 
@Test 
public void method1() { 
    storage = "Hello" 
} 

@Test 
public void method2() { 
    Assert.assertThat(something, is(storage)); 
} 
+0

Tôi đã học được từ khi ban đầu tôi hỏi rằng đó là một điều xấu để làm. ;) – orbfish

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