2015-05-29 23 views
7

Tôi có một bài kiểm tra đơn giản hôm nay:Có cách nào để chạy thử Espresso với nhiều phương pháp thử nhưng chỉ có một phương pháp thiết lập?

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class WhenNavigatingToUsersView { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = 
     new ActivityTestRule(MainActivity.class); 
    private MainActivity mainActivity; 

    @Before 
    public void setActivity() { 
     mainActivity = mActivityRule.getActivity(); 
     onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
    } 

    @Test 
    public void thenCorrectViewTitleShouldBeShown() { 
     onView(withText("This is the Users Activity.")).check(matches(isDisplayed())); 
    } 

    @Test 
    public void thenCorrectUserShouldBeShown() { 
     onView(withText("Donald Duck (1331)")).check(matches(isDisplayed())); 
    } 
} 

Nhưng đối với tất cả các phương pháp thử nghiệm các setActivity được điều hành, trong đó, nếu bạn có 10-15 phương pháp, cuối cùng sẽ tiêu thụ (nếu bạn có nhiều thời gian số lượt xem).

@BeforeClass dường như không hoạt động vì nó phải là tĩnh và do đó buộc ActivityTestRule cũng phải tĩnh.

Vì vậy, có cách nào khác để thực hiện việc này không? Thay vì có nhiều xác nhận trong cùng một phương pháp thử nghiệm?

Trả lời

3

@Before chú thích chỉ nên đứng trước các phương pháp có thiết lập sơ bộ. Khởi tạo các đối tượng cần thiết, nhận phiên hiện tại hoặc hoạt động hiện tại, bạn sẽ có được ý tưởng.

Thay thế phương thức cũ setUp() từ ActivityInstrumentationTestCase2, giống như @After thay thế tearDown(). Điều đó có nghĩa là nó được dự định sẽ được thực hiện trước mỗi bài kiểm tra trong lớp và nó sẽ vẫn như vậy.

Bạn nên không có ViewInteraction, không DataInteraction, không Assertions cũng không View hành động trong phương pháp này, vì đó không phải là mục đích của nó.

Trong trường hợp của bạn, chỉ cần loại bỏ các onView() cuộc gọi từ setActivity() và đặt nó bên trong phương pháp thử nghiệm thực tế, trong mỗi phương pháp thử nghiệm nếu cần thiết, như vậy:

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class WhenNavigatingToUsersView { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = 
     new ActivityTestRule(MainActivity.class); 
    private MainActivity mainActivity; 

    @Before 
    public void setActivity() { 
     mainActivity = mActivityRule.getActivity(); 
     // other required initializations/definitions 
    } 

    @Test 
    public void thenCorrectViewTitleShouldBeShown() { 
     onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
     onView(withText("This is the Users Activity.")).check(matches(isDisplayed())); 
    } 

    @Test 
    public void thenCorrectUserShouldBeShown() { 
     onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
     onView(withText("Donald Duck (1331)")).check(matches(isDisplayed())); 
    } 
} 
+0

Bạn thiếu điểm của tôi ... Có cách nào không phải xác định tương tác xem cho mọi phương pháp thử nghiệm không? Một bài kiểm tra đơn vị tốt cho tôi là một phương pháp thử nghiệm chỉ nên có một khẳng định cho mỗi bài kiểm tra và thiết lập được thực hiện theo phương pháp khác. Xem xét chế độ xem này sẽ có đầy đủ các trường tôi muốn xác minh nếu chúng tồn tại, sẽ rất tốn kém để tương tác với chế độ xem cho mọi thử nghiệm. Khi tôi chỉ muốn "mở" chế độ xem đó một lần và thực hiện nhiều thử nghiệm. – peuhse

+0

Tại sao tôi không nên xem tương tác và các nội dung khác trong setActivity? Một tên tốt hơn sẽ là setupContext hoặc một cái gì đó và thêm tất cả các điều kiện tiên quyết để thử nghiệm ở đó. Đó là ý định của từ khóa @Before trong junit ... – peuhse

0

Một tùy chọn khác cho bạn sẽ được tách những thử nghiệm .

Nhấp vào biểu tượng của người dùng sẽ ở trong lớp thử nghiệm HomeActivity trong khi phần còn lại của các bài kiểm tra sẽ nằm trong lớp kiểm tra UserActivity.

Lớp kiểm tra UserActivity sẽ khởi chạy UserActivity với Intent thích hợp (bạn có thể làm như vậy bằng cách chuyển Boolean sai vào hàm tạo Quy tắc và gọi launchActivity(intent) theo cách thủ công).

Điều này sẽ loại bỏ sự cần thiết phải thiết lập hoạt động mỗi lần. Nó cũng sẽ loại bỏ sự phụ thuộc liên tục vào hoạt động chính. Nếu xảy ra sự cố, các kiểm tra UserActivity của bạn sẽ vẫn còn nguyên vẹn và sẽ tạo ra kết quả, trong khi vấn đề này sẽ bị kiểm tra trong MainActivity.

Thực ra, bằng cách làm như vậy, các thử nghiệm của bạn sẽ có thể trở thành MediumSize khi thời gian chạy sẽ giảm đáng kể.

+0

Tôi có thể có thể giống như vậy. Nhưng UsersActivity không phải là một hoạt động, nó là một mảnh. Tôi chỉ có một hoạt động cho đến nay; Hoạt động chủ yêu. Và tất cả điều hướng đi đến các mảnh khác nhau. – peuhse

0

Bạn có thể thử này:

**** Setting **** 
public void testStory() throws Exception { 

} 

public void testStory2() throws Exception { 

} 

public void testStory3() throws Exception { 

} 

Cố gắng chạy thử nghiệm của bạn bằng lệnh này:

./gradlew cC 
0

Bạn có cố gắng làm việc đó như sau hoặc một biến thể nhỏ của nó cho phù hợp với nhu cầu của bạn:

@Rule 
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class); 
private MainActivity mainActivity = mActivityRule.getActivity(); 

@BeforeClass 
public static void setActivity() { 
    onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
} 

Bằng cách này, bạn 'mainActivity' không cần tĩnh.Ngoài ra, phương thức setActivity() sẽ chỉ được gọi một lần.

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