Pro*_*mer 6 android android-intent android-asynctask android-espresso
我正在写Espresso Test.这是测试用例
点击Fab,该应用程序启动QuizActivity.
让我向你解释我的应用程序.
所以应用程序的要求是 -
这是我编码的方式 -
以下是我的测试
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
/* @Rule
public IntentsTestRule<MainActivity> intentsTestRule =
new IntentsTestRule<MainActivity>(MainActivity.class);
*/
@Rule
public ActivityTestRule<MainActivity> intentsTestRule =
new ActivityTestRule<MainActivity>(MainActivity.class,false,true);
@Test
public void fabTest(){
onView(withId(R.id.fab)).perform(click());
//Check if the text_question textview is displayed
onView(withId(R.id.text_question)).check(matches(isDisplayed()));
}
/* @Test
public void clickFloatingActionButton() {
onView(withId(R.id.fab))
.perform(click());
intended(hasComponent(new ComponentName(getTargetContext(), QuizActivity.class)));
}*/
}
Run Code Online (Sandbox Code Playgroud)
我的方法是 -
在我运行测试后,我得到了
java.lang.RuntimeException:无法在45秒内启动意图Intent {act = android.intent.action.MAIN flg = 0x14000000 cmp = my_package_name/.MainActivity}.也许主线程在合理的时间内没有闲置?可能会有一个动画或不断重新绘制屏幕的东西.或者活动是在创建网络呼叫?请参阅threaddump日志.在您的活动启动请求为1505287862579之前,上次事件队列空闲的时间供您参考,现在队列最后一次空闲时间是:1505287862579.如果这些数字相同,您的活动可能会占用事件队列.
PS - 我关掉了所有的动画.我在代码中没有进度条.
还有一点需要注意,如果我在onCreate()方法中注释掉AsyncTask,AsyncTaskLoader,RecyclerView部分,那么测试就会通过.
我怀疑它可能是由于后台任务造成的.
有人遇到类似问题吗?如果您知道解决方案,请告诉我.我两天都在苦苦挣扎.我在stackoverflow上搜索了类似的线程,但没有任何对我有用.
我终于找到解决方案了!
实际上,罪魁祸首是我的适配器中的自定义视图。
Espresso 等待AsyncTask或AsyncTaskLoader加载数据,但它看起来像自定义视图导致此问题,如异常中所述:
主线程在合理的时间内没有空闲?可能有动画或某些东西不断地重新绘制屏幕。
无论如何,要克服这个问题,我需要做的是 -
“如果测试正在运行,请将自定义视图的可见性设置为“消失”
你会怎么做?
private AtomicBoolean isTestRunning;
public synchronized boolean isTestRunning () {
if (null == isTestRunning) {
boolean istest;
try {
Class.forName ("Full path of your TestName"); // for e.g. com.example.MyTest
istest = true;
} catch (ClassNotFoundException e) {
istest = false;
}
isTestRunning = new AtomicBoolean (istest);
}
return isRunningTest.get ();
}
Run Code Online (Sandbox Code Playgroud)
现在我在这里使用Recyclerviewso ViewHolder,
public InsectHolder(View itemView)
{
super(itemView);
customView = (DangerLevelView) itemView.findViewById(R.id.danger_level_tv);
if(isRunningTest()) {
customView.setVisibility(View.GONE);
}
}
Run Code Online (Sandbox Code Playgroud)
耶!你的测试将会通过。
希望有人觉得它有帮助!
如果您有任何疑问,请在下面的评论部分告诉我!
| 归档时间: |
|
| 查看次数: |
3462 次 |
| 最近记录: |