Android 空闲资源忙时测试UI
我是android测试新手,遇到了一个问题。我正在使用RxJava,为了测试UI,我正在使用IdlingResource。当空闲资源忙时,我无法测试UI 例如:我有一个按钮。我正在做一个请求。请求时,按钮将禁用。请求后,按钮处于启用状态。我想测试以下3个步骤:Android 空闲资源忙时测试UI,android,rx-java,android-espresso,android-testing,ui-testing,Android,Rx Java,Android Espresso,Android Testing,Ui Testing,我是android测试新手,遇到了一个问题。我正在使用RxJava,为了测试UI,我正在使用IdlingResource。当空闲资源忙时,我无法测试UI 例如:我有一个按钮。我正在做一个请求。请求时,按钮将禁用。请求后,按钮处于启用状态。我想测试以下3个步骤: 按钮在请求之前启用 按钮在请求时被禁用(onCLick) 当请求结束且响应消息返回时,按钮被启用 如果你能在这个问题上帮助我,我将非常高兴 如果你需要更多关于我的问题的信息,请告诉我。我将编辑我的帖子据我所知,您正在尝试测试您的UI。如果
如果你需要更多关于我的问题的信息,请告诉我。我将编辑我的帖子据我所知,您正在尝试测试您的UI。如果是这样,请确保您以正确的方式进行:
1)。你不需要真正的请求。
请理解,在类似情况下,您的测试必须始终具有相同的行为。换句话说,它必须给出相同的结果,即传递相同的输入参数。
您现在的输入参数:
1.1). 按钮在请求前已启用
1.2). 按钮在请求过程中被禁用
1.3). 请求后启用的按钮
从这个列表中可以看出,您不需要执行真正的请求。对您来说,什么服务器将返回您(错误或成功)并不重要。你甚至不需要服务器。你所需要的只是一个“东西”,它的行为就像一个真正的服务器。换句话说,您必须模拟您的API客户机 我想你是在使用改装。如果没有,则必须为客户端创建
接口
包装器。如果您正在使用改型,只需模拟您的界面
假设您有下一个接口
:
public interface ApiClient{
@GET("/items")
Observable<MyResponse> doSomeRequest();
}
您应该如何在测试中执行此操作:
import static org.mockito.Mockito.*;
在试验方法中:
ApiClient apiMock = mock(ApiClient.class);
when(apiMock.doSomeRequest())
.thenReturn(Observable.just(fakeResponse));
或
您应该将apiMock
传递给您尝试测试的Activity
/Fragment
。怎么做见#2 2.使用依赖注入(DI) 关于这件事我不会写太多。
我只是建议您阅读有关的文档 特别是,当您可以使用实际实现进行生产,使用模拟实现进行测试时,如何以这种方式组织项目: 换句话说,当您要构建应用程序以供使用时,您提供了真正的依赖项(在您的情况下,它将是
ApiClient
的真正实现),并且当您要测试某些UI或业务逻辑时,您通过了模拟依赖项,这些依赖项在测试之前已经指定了行为
这就是我想告诉你的一切。希望这有帮助,如果您还有其他问题,请告诉我。据我所知,您正在尝试测试您的UI。如果是这样,请确保您以正确的方式进行:
1)。你不需要真正的请求。
请理解,在类似情况下,您的测试必须始终具有相同的行为。换句话说,它必须给出相同的结果,即传递相同的输入参数。
您现在的输入参数:
1.1). 按钮在请求前已启用
1.2). 按钮在请求过程中被禁用
1.3). 请求后启用的按钮
从这个列表中可以看出,您不需要执行真正的请求。对您来说,什么服务器将返回您(错误或成功)并不重要。你甚至不需要服务器。你所需要的只是一个“东西”,它的行为就像一个真正的服务器。换句话说,您必须模拟您的API客户机 我想你是在使用改装。如果没有,则必须为客户端创建
接口
包装器。如果您正在使用改型,只需模拟您的界面
假设您有下一个接口
:
public interface ApiClient{
@GET("/items")
Observable<MyResponse> doSomeRequest();
}
您应该如何在测试中执行此操作:
import static org.mockito.Mockito.*;
在试验方法中:
ApiClient apiMock = mock(ApiClient.class);
when(apiMock.doSomeRequest())
.thenReturn(Observable.just(fakeResponse));
或
您应该将apiMock
传递给您尝试测试的Activity
/Fragment
。怎么做见#2 2.使用依赖注入(DI) 关于这件事我不会写太多。
我只是建议您阅读有关的文档 特别是,当您可以使用实际实现进行生产,使用模拟实现进行测试时,如何以这种方式组织项目: 换句话说,当您要构建应用程序以供使用时,您提供了真正的依赖项(在您的情况下,它将是
ApiClient
的真正实现),并且当您要测试某些UI或业务逻辑时,您通过了模拟依赖项,这些依赖项在测试之前已经指定了行为
这就是我想告诉你的一切。希望这对您有所帮助,如果您还有其他问题,请告诉我。除此之外还有一些小问题。我会使用主题
作为“模拟”api。这允许您控制执行
//setup your test
Subject<Response,Response> stubResponse = AsyncSubject.create();
ApiClient apiMock = mock(ApiClient.class);
when(apiMock.doSomeRequest()).thenReturn(stubResponse.asObservable());
//check first condition that button is enabled before executing action
//click on button
//test your second condition that button is disabled while waiting for response
stubResponse.onNext(fakeResponse); //return fake response
stubResponse.onCompleted();
//test your third condition that button is enabled when you get response back
//设置您的测试
Subject stubResponse=AsyncSubject.create();
ApiClient apiMock=mock(ApiClient.class);
when(apiMock.doSomeRequest())。然后返回(stubResponse.asObservable());
//在执行操作之前,检查按钮已启用的第一个条件
//点击按钮
//测试在等待响应时按钮被禁用的第二个条件
stubResponse.onNext(fakerresponse)//返回假响应
stubResponse.onCompleted();
//测试您的第三个条件,即当您得到响应时按钮已启用
评论。不要在测试中使用sleep
。它会减慢你的测试速度并增加片状 少量添加到。我会使用主题
作为“模拟”api。这允许您控制执行
//setup your test
Subject<Response,Response> stubResponse = AsyncSubject.create();
ApiClient apiMock = mock(ApiClient.class);
when(apiMock.doSomeRequest()).thenReturn(stubResponse.asObservable());
//check first condition that button is enabled before executing action
//click on button
//test your second condition that button is disabled while waiting for response
stubResponse.onNext(fakeResponse); //return fake response
stubResponse.onCompleted();
//test your third condition that button is enabled when you get response back
//设置您的测试
Subject stubResponse=AsyncSubject.create();
ApiClient apiMock=mock(ApiClient.class);
当(apiMock.doSomeRequest())时,返回(stubResponse.asObservable