如何将TDD应用于web API开发

如何将TDD应用于web API开发,api,google-app-engine,rest,tdd,Api,Google App Engine,Rest,Tdd,我正在设计一个运行在Google App Engine上的web服务,它可以抓取许多网站,并通过RESTful界面显示它们的数据。基于一些背景阅读,我想我应该尝试测试驱动开发(TDD),并在编写任何业务代码之前开发我的测试 我的问题是由以下事实引起的,即我的已删除元素列表中包含了时刻表和其他经常更改的记录。我对TDD的了解有限,因为您编写的测试检查代码执行的结果,并将这些结果与硬编码的结果集进行比较。由于数据集经常变化,这种方法似乎是不可能的。假设这是真的,那么测试这样一个API的最佳方法是什么

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


我的问题是由以下事实引起的,即我的已删除元素列表中包含了时刻表和其他经常更改的记录。我对TDD的了解有限,因为您编写的测试检查代码执行的结果,并将这些结果与硬编码的结果集进行比较。由于数据集经常变化,这种方法似乎是不可能的。假设这是真的,那么测试这样一个API的最佳方法是什么?如何测试大规模web API(Twitter、Google、Netflix等)?

根据您的描述,您很容易发现自己正在编写集成测试。如果您的目标是测试处理从刮取数据返回的数据的逻辑(例如,您知道您将获得一个特定格式的时间表,并且您现在拥有处理该数据的逻辑),那么您需要在web服务逻辑和处理逻辑之间创建一个接缝。完成此操作后,您应该能够模拟从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方法返回您喜欢的任何数据。有一些非常好的模拟框架可以让这类事情变得简单。我个人最喜欢的是NSubstitue


我希望这个解释有帮助。

您必须选择测试类型:

  • 只需测试模块(单元)的正常运行即可。您提供输入数据并测试代码是否输出正确的结果。如果您尝试使用系统相关类或GAE服务,则使用google提供的。单元测试可以在本地计算机上运行,也可以在上运行。java有两种流行的单元测试库:
  • 集成测试检查各个模块(内部和外部)是否协同工作——它们基本上检查模块之间的API是否正常工作。它们通常在真正的服务器上运行,并调用真正的外部服务。它们是特定于技术的,更难运行
  • 在您的情况下,我将进行单元测试,并提供一组不同的输入数据,您应该对这些数据进行逻辑分析和处理。由于您的流程非常简单(从固定Url加载数据,并对其进行解析),所以您还可以将真实数据的加载嵌入到单元测试中(我们在解析外部源时会这样做)