2016-07-25 23 views
7

Tôi chỉ mới bắt đầu với thử nghiệm trong Android và điều này có vẻ rất cơ bản nhưng sau nhiều googling tôi vẫn không thể tìm thấy câu trả lời bất cứ nơi nào.Cách kiểm tra Hoạt động cụ thể với Espresso?

Trong ứng dụng Android, hoạt động đầu tiên được hiển thị là màn hình đăng nhập, sau đó là màn hình chính có các tùy chọn để điều hướng đến các hoạt động khác. Để kiểm tra hoạt động tôi muốn hiện tại tôi phải chuyển qua hai hoạt động này trước tiên.

Làm cách nào để thiết lập kiểm tra Espresso (sử dụng ActvityTestRule/JUnit4) để nó khởi chạy hoạt động tôi muốn kiểm tra ngay lập tức?

EDIT

Cụ thể hơn, vấn đề của tôi là trong tất cả các hướng dẫn Tôi đã thấy cho Espresso kiểm tra tất cả các bài kiểm tra bắt đầu vào hoạt động chính của ứng dụng với một ActivityTestRule trông như thế này

@Rule 
public final ActivityTestRule<MainActivity> mRule = new ActivityTestRule<MainActivity>(MainActivity.class); 

Tôi muốn các thử nghiệm bắt đầu tại một hoạt động được chỉ định, hiện tôi đang điều hướng đến bằng cách lặp lại mã kiểm tra như thế này

onView(withId(R.id.go_to_other_activity_button)).perform(click()) 
+1

tôi có thể đề nghị [link này] (https://google.github.io/android-testing-support-library/docs/espresso/index.html) và [cái này] (https://developer.android.com/training/testing/ui-testing/espresso-testing.html)? – ddb

+0

Tôi đã nhìn thấy các liên kết đó, bạn chỉ ra thông tin cụ thể nào giúp tôi giải quyết vấn đề của mình? – Moses

+0

xin lỗi @Moses, nhưng từ câu hỏi của bạn nó không rõ ràng bạn googled cho một số giải pháp trước khi gửi bài ở đây – ddb

Trả lời

7

Nếu bạn muốn chạy hoạt động cụ thể thì: ActivityTestRule hoặc IntentTestRule là những gì bạn cần.

Hợp đồng khá tự giải thích chỉ cần đặt hoạt động mong muốn của bạn mà bạn muốn bắt đầu làm tham số đầu tiên.

ActivityTestRule<>(ActivityYouWantToStart.class, initialTouchMode, launchActivity) //rule for activity start 


IntentTestRule<>(ActivityYouWantToStart.class, initialTouchMode, launchActivity) //used for testing intents and activities 

quan trọng cần chú ý ở đây là launchActivity boolean. Nếu bạn đặt điều này thành đúng, mỗi thử nghiệm sẽ tự động khởi chạy hoạt động.

Cách sử dụng khác là nếu một số hoạt động mong đợi một số ý định, dữ liệu hoặc tương tự được gửi đến trước khi chạy chúng, bạn có thể đặt tham số này thành false và chuẩn bị ứng dụng của bạn trước khi chạy thử nghiệm/hoạt động.

Ví dụ, nếu bạn cần một người dùng đăng nhập được lưu trong sở thích chia sẻ của bạn để chạy Hoạt động B và logic của hoạt động nói rằng:

if(!userIsLoggedIn()){ 

    jumpToMainActivity(); 

} 

Sau đó, bạn có thể tiết kiệm một số người dùng giả trước khi chạy thử nghiệm hoặc ví dụ điền vào cơ sở dữ liệu với các đối tượng giả và sau khi bạn chuẩn bị môi trường cho Hoạt động B mọi thứ thì bạn gọi.

mActivityRule.launchActivity(null); 

ý rằng launchActivity lấy ví dụ, đây là thực Ý định rằng Hoạt động B nhận được, nếu nó hy vọng một số dữ liệu bổ sung trong cách mà bạn có thể chuẩn bị tiếp cận mục đích trước khi bắt đầu thử nghiệm.

Full ví dụ về chạy hoạt động tùy chỉnh:

/** 
* Testing of the snackbar activity. 
**/ 
@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class SnackbarActivityTest{ 
    //espresso rule which tells which activity to start 
    @Rule 
    public final ActivityTestRule<SnackbarActivity> mActivityRule = 
     new ActivityTestRule<>(SnackbarActivity.class, true, false); 


    @Override 
    public void tearDown() throws Exception { 
     super.tearDown(); 
     //just an example how tear down should cleanup after itself 
     mDatabase.clear(); 
     mSharedPrefs.clear(); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     //setting up your application, for example if you need to have a user in shared 
     //preferences to stay logged in you can do that for all tests in your setup 
     User mUser = new User(); 
     mUser.setToken("randomToken"); 
    } 

    /** 
    *Test methods should always start with "testXYZ" and it is a good idea to 
    *name them after the intent what you want to test 
    **/ 
    @Test 
    public void testSnackbarIsShown() { 
     //start our activity 
     mActivityRule.launchActivity(null); 
     //check is our text entry displayed and enter some text to it 
     String textToType="new snackbar text"; 
     onView(withId(R.id.textEntry)).check(matches(isDisplayed())); 
     onView(withId(R.id.textEntry)).perform(typeText(textToType)); 
     //click the button to show the snackbar 
     onView(withId(R.id.shownSnackbarBtn)).perform(click()); 
     //assert that a view with snackbar_id with text which we typed and is displayed 
     onView(allOf(withId(android.support.design.R.id.snackbar_text), 
     withText(textToType))) .check(matches(isDisplayed())); 
    } 
} 
Các vấn đề liên quan