1

我正在设计一个在 Google App Engine 上运行的 Web 服务,它可以抓取多个网站并通过 RESTful 界面呈现它们的数据。基于一些背景阅读,我想我想在编写任何业务代码之前尝试测试驱动开发 (TDD) 并开发我的测试。

我的问题是由于我的抓取元素列表包括时间表和其他经常更改的记录。我对 TDD 知识的局限在于您编写测试来检查代码执行的结果并将这些结果与硬编码的结果集进行比较。鉴于数据集变化频繁,这种方法似乎是不可能的。假设这是真的,那么测试这种 API 的最佳方法是什么?如何测试大型 Web API(Twitter、Google、Netflix 等)?

4

2 回答 2

3

您必须选择测试类型:

  1. 单元测试只是测试你的模块(单元)的正确操作。您提供输入数据并测试代码输出正确的结果。如果有系统相关的类你试图模拟它们,或者在 GAE 服务的情况下,你使用谷歌提供的本地服务。单元测试可以在您的机器或CI 服务器上本地运行。有两个流行的 java 单元测试库:Junit 和 TestNG
  2. 集成测试检查各种模块(内部和外部)是否一起工作——它们基本上检查模块之间的 API 是否正常工作。它们通常在真实服务器上运行并调用真实的外部服务。它们是特定于技术的,并且更难运行。

在您的情况下,我将使用单元测试并提供您的逻辑应该解析和采取行动的不同输入数据集。由于您的流程非常简单(从固定 Url 加载数据,解析它),您还可以将真实数据的加载嵌入到单元测试中(我们在解析外部源时这样做)。

于 2013-07-18T09:54:49.977 回答
0

根据您的描述,您可以轻松地发现自己正在编写集成测试。如果您的目标是测试处理从抓取的数据返回的内容的逻辑(例如,您知道您将获得特定格式的时间表,并且您现在有处理该数据的逻辑),您将需要创建Web 服务逻辑和处理逻辑之间的 SEAM。完成此操作后,您应该能够模拟从 Web 服务调用返回的数据以始终返回相同的表数据,然后您可以针对它编写一致的单元测试。

    public class ScrapingService : IScrapingService
    {
       public string Scrape(string url)
       {// scraping logic}
    }

    public interface IScrapingService
    {
       string Scrape(string url);
    }


   public class ScrapingProcessor
   {
     private IScrapingService _scrapingService
     // inject the dependency
     pubilc ScrapingProcessor(IScrapingService scrapingService)
     {
       _scrapingService = scrapingService;
     }

     public void Process(string url)
     {

       var scrapedData = _scrapingService.Scrape(url)
       // now process the scrapedData
     }


   }

为了进行测试,您现在可以创建一个实现 IScrapingService 接口的 FakeScrapingService,然后从 Scrape 方法返回您喜欢的任何数据。有一些非常好的 Mocking 框架可以让这类事情变得简单。我个人最喜欢的是 NSubstitue。

我希望这个解释有所帮助。

于 2013-07-18T06:58:32.983 回答