测试自动化API测试

时间:2014-07-28 15:04:55

标签: c# selenium nunit phantomjs

我想设置自动化测试,以测试API。 更确切地说,例如,我想发送HTTP请求(POSTS)并测试响应。因此,它必须是无头浏览器测试。

我已将Selenium与NUnit和Phantom JS一起设置为驱动程序。测试是用C#编写的,我使用Visual Studio作为IDE。

我一直在谷歌搜索,但我似乎找不到上述组合的问题的具体答案。

上面的组合是否允许我编写测试来测试API,或者发送和接收HTTP请求和响应?

4 个答案:

答案 0 :(得分:3)

您可能需要考虑的一个解决方案是使用Runscope。 Runscope提供了创建发送一个或多个HTTP请求的测试的能力。您可以使用来自一个请求的信息来驱动下一个请求。您可以安排测试定期运行,也可以使用webhook触发它们 您还可以从世界各地的不同数据中心运行测试,以测试响应时间。

有一个免费套餐,每月最多允许10,000个请求。

免责声明:我是Runscope的开发者倡导者。

答案 1 :(得分:1)

嗯,我可以通过最近几个月的经验回答我的问题。我编写自动化测试来发送测试请求,如post,get,put等,并使用基本的http响应正文和状态代码测试结果。这是测试api最简单的方法。当然,如果有人想进行深度测试,例如负载测试,那么可以使用适当的工具。

答案 2 :(得分:0)

我没有使用过NUnit或Phantom JS,但是,如果您的测试是用C#编写的,我想知道相同的代码是否适用。

我在测试课上写了一个助手,所以我可以轻易地一遍又一遍地做到这一点:

/// <summary>
    /// Submit post request with an arbitrary input model and an arbitrary output model (could be the same model).
    /// URL's of format baseURL/controller/action a la .NET MVC web api, i.e., http://something.com/api/Product/Sales
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="U"></typeparam>
    /// <param name="controller"></param>
    /// <param name="action"></param>
    /// <param name="inputModel"></param>
    /// <returns></returns>
    private U DoWebAPIPostRequest<T, U>(string controller, string action, T inputModel)
    {
        string baseURL = "http://localhost:1234/api"; //add your base url for your service here

        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
            string url = baseURL + "api/" + controller + "/" + action;

            var response = client.PostAsJsonAsync<T>(url, inputModel);
            string error = response.Result.Content.ReadAsStringAsync().Result;

            if (response.Result.IsSuccessStatusCode)
            {
                U result = response.Result.Content.ReadAsAsync<U>().Result;

                return result;
            }
            else throw new Exception(error);

        }
    }

然后从每个测试中调用它(这段代码假设您有一些POCO来表示进出Web服务的内容 - 我确信您可以发送和接收文本,但我对它很熟悉):

Sale saleToAdd = new Sale("...");
RequestResult result= DoWebAPIPostRequest<Sale, RequestResult>("Product", "Sale", saleToAdd);

答案 3 :(得分:0)

我使用PhantomJS(实际上我通常使用CasperJS作为PhantomJS的高级包装器)来测试Web服务。它非常棒(比Selenium好得多,它只想充当浏览器,所以不要让我直接POST到URL。)

我有一些我通过PHPUnit控制的PhantomJS测试,所以我相信你可以用C#和NUnit做同样的事情。我这样做的方式是:

  1. 在PHP字符串中构建JavaScript脚本
  2. 将PHP字符串保存到临时文件
  3. $command="/usr/local/bin/phantomjs --ignore-ssl-errors=true ".escapeshellarg($temp_filename);
  4. 在shell中运行$command
  5. 删除临时文件
  6. 检查命令输出以确定测试是通过还是失败。
  7. 我也直接使用套接字运行相同的测试,并使用Selenium(告诉它跳过需要POST数据的测试)。我喜欢这种覆盖,因为正在测试的API将在浏览器内部和外部使用。如果您的Web服务仅在浏览器内使用,PhantomJs测试就是您所需要的;如果你的Web服务只能用于C#代码,那么使用.NET的HttpClient对象,如另一个答案所示,是最好的。