我们使用基于放心库和专有库的专有框架。 Testng为我们的REST Web服务自动化API测试。我看到一些api测试代码使用Thread.sleep(n seconds)
等待返回响应。这对我来说似乎不对,因为响应时间可能会有所不同。我认为应该有一种更好的方法来等待响应,即只需要等待。也许我可以每隔几毫秒轮询一次,或使用观察者(测试) - 观察(api)设计模式或其他东西。我不确定。
如何等待api返回回复?
这就是代码的样子:
@Test
public void doApiTesting() throws Exception
{
framework.loginUser(User);
framework.createNewData();//Takes some time.
Thread.sleep(10000);
}
答案 0 :(得分:1)
framework.createNewData();//Takes some time.
如果你可以重构createNewData()
,你应该:在你完成数据创建过程之前不要回头。该名称并不表示该调用只是 来启动数据创建过程,因此某些使用您的API的程序员可能会花费大量时间来调试由代码假定的问题在电话会议结束后,数据就会出现。
如果你必须回来,你至少可以给它一个更好的名字。类似于startNewDataCreation(callback)
,其中callback
将是您引用的观察者。
如果您根本无法更改实施,则更好的选择可能是检查数据是否定期创建。这至少可以保证正确性; Thread.sleep(10000);
似乎是一种可能在不利条件下失败的黑客。
答案 1 :(得分:1)
使用支持异步测试的测试框架,如ScalaTest(可以与java一起使用)或阻止调用。
例如,如果通话符合CompletionStage
界面,您可以:
@Test
public void doApiTesting() throws Exception
{
framework.loginUser(User);
framework.createNewData()
.toCompletableFuture().get();
}
顺便说一句,我希望你不要在单元测试中对API或数据库进行外部调用。如果你是,那么它们不是单元测试;)