如何根据Google Cloud Endpoints编写API测试?

时间:2014-04-14 10:23:16

标签: java google-app-engine maven testing google-cloud-endpoints

是否有某种方法可以使用JUnit或其他框架测试使用Google Cloud Endpoint编写的API?

在文档中有一个使用 curl 命令的示例,也许这背后的逻辑是仅在客户端测试API。

当我试图找到一些方法如何从服务器端测试API时,我遇到了编写JUnit测试并调用 HttpURLConnection 到localhost的可能性,但是存在问题用这种方法。例如,应用程序引擎的实例应该在测试之前已经运行,但我在本地部署maven并且测试是先前部署的,所以如果我已经破坏了测试它不会部署开发服务器而我觉得那不是正确的方法来重写maven步骤。

编辑1:为Python找到了类似的内容:How to unit test Google Cloud Endpoints

2 个答案:

答案 0 :(得分:4)

使用Objectify你可以这样做。例如,让我们按如下方式声明我们的BooksEndpoint

@Api(
    name = "books",
    version = "v1",
    namespace = @ApiNamespace(ownerDomain = "backend.example.com", ownerName = "backend.example.com", packagePath = "")
)
public class BooksEndpoint {

    @ApiMethod(name = "saveBook")
    public void saveBook(Book book, User user) throws OAuthRequestException, IOException {
        if (user == null) {
            throw new OAuthRequestException("User is not authorized");
        }

        Account account = AccountService.create().getAccount(user);

        ofy().save()
                .entity(BookRecord.fromBook(account, book))
                .now();
    }

}

要测试它,您需要以下依赖项:

testCompile 'com.google.appengine:appengine-api-labs:1.9.8'
testCompile 'com.google.appengine:appengine-api-stubs:1.9.8'
testCompile 'com.google.appengine:appengine-testing:1.9.8'
testCompile 'junit:junit:4.12'

现在,测试将如下所示:

public class BooksEndpointTest {

    private final LocalServiceTestHelper testHelper = new LocalServiceTestHelper(
            new LocalDatastoreServiceTestConfig()
    );

    private Closeable objectifyService;

    @Before
    public void setUp() throws Exception {
        testHelper.setUp();
        objectifyService = ObjectifyService.begin(); // required if you want to use Objectify
    }

    @After
    public void tearDown() throws Exception {
        testHelper.tearDown();
        objectifyService.close();
    }

    @Test
    public void testSaveBook() throws Exception {
        // Create Endpoint and execute your method
        new BooksEndpoint().saveBook(
                Book.create("id", "name", "author"),
                new User("example@example.com", "authDomain")
        );

        // Check what was written into datastore
        BookRecord bookRecord = ofy().load().type(BookRecord.class).first().now();

        // Assert that it is correct (simplified)
        assertEquals("name", bookRecord.getName());
    }

}

注意,我在这里使用BookRecordBook - 这些是我的实体和POJO,没什么特别的。

答案 1 :(得分:1)

首先,感谢Python答案的链接。关于Java,这个Udacity course基于Java中的Google Cloud Endpoints项目,它有许多关于如何测试端点的代码示例。源代码为here。我一直在尝试用Python重现该项目,遗憾的是我无法根据个人使用Java编写的端点的经验提供任何细节,但我希望这些链接有所帮助!