当前位置:首页 > 开发教程 > .net教程 >

如何测试客户端工作中的Web API

时间:2016-06-01 09:16 来源:互联网 作者:源码搜藏 收藏

在这篇文章中,我们将看到我们如何测试我们的API与一个叫WebApiTestClient包的帮助。 大家都知道,如果你创建一个示例API项目,你会得到一个地区文件夹HelpPage。 这是添加XML描述到每个控制器和行动,我们使用[…] 在这篇文章中,我们将看到我们如何
在这篇文章中,我们将看到我们如何测试我们的API与一个叫WebApiTestClient包的帮助。大家都知道,如果你创建一个示例API项目,你会得到一个地区文件夹HelpPage。这是添加XML描述到每个控制器和行动,我们使用[…]

在这篇文章中,我们将看到我们如何测试我们的API与一个叫包的帮助WebApiTestClient大家都知道,如果你创建一个示例API项目,你会得到一个地区文件夹HelpPage。这是添加XML描述到每个控制器和行动,我们我们的API使用。如果你记录得很好,任何一个能理解你的API,这样你就不需要解释什么你的API会做,会产生什么输出。如果你是新来HelpPage实施API,请在这里看到:在网页API API帮助页面控制器操作说明在这里,我要创建一个网页API在帮助页面描述的Visual Studio 2015年。之后一旦该项目已准备就绪,我将安装WebApiTestClient包我的解决方案。我希望你会喜欢这一点。

请注意,这个包没有正式Microsoft发布。这是创建一个原型姚- MSFT

下载源代码

你总是可以在这里下载源代码:API测试客户端

背景

在过去的几个月里,我一直在努力与API项目。最近,我被要求创建一个应用程序来测试我创造,使测试团队可以方便地测试API的API。是的,我同意,我们有像提琴手和邮递员为相同的工具。然而,我们认为,以创造我们自己的。当我开始我的发展,我才知道包WebApiTestClient它做什么我们想要的。最后,我们决定停止开发应用程序,并使用这个奇妙的包。在这里,我要告诉你我们如何能够利用这一点。

先决条件

  • Visual Studio中的Web API安装

事情我们要做

以下是我们将要执行的任务。

  • 建立数据库
  • 创建实体框架
  • 与创建的模型创建API控制器
  • 安装WebApiTestClient
  • 配置WebApiTestClient
  • 测试WebApiTestClient

建立数据库

在这里,我要创造,我为我的演示目的创建的数据库,可以随时通过运行在这里提到的查询,创建这个数据库。

创建数据库

USE [master]
GO

/****** Object:  Database [TrialsDB]    Script Date: 5/12/2016 10:56:41 AM ******/
CREATE DATABASE [TrialsDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TrialsDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TrialsDB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'TrialsDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TrialsDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [TrialsDB] SET COMPATIBILITY_LEVEL = 110
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TrialsDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [TrialsDB] SET ANSI_NULL_DEFAULT OFF 
GO

ALTER DATABASE [TrialsDB] SET ANSI_NULLS OFF 
GO

ALTER DATABASE [TrialsDB] SET ANSI_PADDING OFF 
GO

ALTER DATABASE [TrialsDB] SET ANSI_WARNINGS OFF 
GO

ALTER DATABASE [TrialsDB] SET ARITHABORT OFF 
GO

ALTER DATABASE [TrialsDB] SET AUTO_CLOSE OFF 
GO

ALTER DATABASE [TrialsDB] SET AUTO_CREATE_STATISTICS ON 
GO

ALTER DATABASE [TrialsDB] SET AUTO_SHRINK OFF 
GO

ALTER DATABASE [TrialsDB] SET AUTO_UPDATE_STATISTICS ON 
GO

ALTER DATABASE [TrialsDB] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO

ALTER DATABASE [TrialsDB] SET CURSOR_DEFAULT  GLOBAL 
GO

ALTER DATABASE [TrialsDB] SET CONCAT_NULL_YIELDS_NULL OFF 
GO

ALTER DATABASE [TrialsDB] SET NUMERIC_ROUNDABORT OFF 
GO

ALTER DATABASE [TrialsDB] SET QUOTED_IDENTIFIER OFF 
GO

ALTER DATABASE [TrialsDB] SET RECURSIVE_TRIGGERS OFF 
GO

ALTER DATABASE [TrialsDB] SET  DISABLE_BROKER 
GO

ALTER DATABASE [TrialsDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO

ALTER DATABASE [TrialsDB] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO

ALTER DATABASE [TrialsDB] SET TRUSTWORTHY OFF 
GO

ALTER DATABASE [TrialsDB] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO

ALTER DATABASE [TrialsDB] SET PARAMETERIZATION SIMPLE 
GO

ALTER DATABASE [TrialsDB] SET READ_COMMITTED_SNAPSHOT OFF 
GO

ALTER DATABASE [TrialsDB] SET HONOR_BROKER_PRIORITY OFF 
GO

ALTER DATABASE [TrialsDB] SET RECOVERY FULL 
GO

ALTER DATABASE [TrialsDB] SET  MULTI_USER 
GO

ALTER DATABASE [TrialsDB] SET PAGE_VERIFY CHECKSUM  
GO

ALTER DATABASE [TrialsDB] SET DB_CHAINING OFF 
GO

ALTER DATABASE [TrialsDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO

ALTER DATABASE [TrialsDB] SET TARGET_RECOVERY_TIME = 0 SECONDS 
GO

ALTER DATABASE [TrialsDB] SET  READ_WRITE 
GO

创建数据表

USE [TrialsDB]
GO
/****** Object:  Table [dbo].[Product]    Script Date: 5/12/2016 10:54:48 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Product](
	[ProductID] [int] NOT NULL,
	[Name] [nvarchar](max) NOT NULL,
	[ProductNumber] [nvarchar](25) NOT NULL,
	[MakeFlag] [bit] NOT NULL,
	[FinishedGoodsFlag] [bit] NOT NULL,
	[Color] [nvarchar](15) NULL,
	[SafetyStockLevel] [smallint] NOT NULL,
	[ReorderPoint] [smallint] NOT NULL,
	[StandardCost] [money] NOT NULL,
	[ListPrice] [money] NOT NULL,
	[Size] [nvarchar](5) NULL,
	[SizeUnitMeasureCode] [nchar](3) NULL,
	[WeightUnitMeasureCode] [nchar](3) NULL,
	[Weight] [decimal](8, 2) NULL,
	[DaysToManufacture] [int] NOT NULL,
	[ProductLine] [nchar](2) NULL,
	[Class] [nchar](2) NULL,
	[Style] [nchar](2) NULL,
	[ProductSubcategoryID] [int] NULL,
	[ProductModelID] [int] NULL,
	[SellStartDate] [datetime] NOT NULL,
	[SellEndDate] [datetime] NULL,
	[DiscontinuedDate] [datetime] NULL,
	[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
	[ModifiedDate] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (1, N'Adjustable Race', N'AR-5381', 0, 0, NULL, 1000, 750, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'694215b7-08f7-4c0d-acb1-d734ba44c0c8', CAST(0x00009A5C00A53CF8 AS DateTime))
INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (2, N'Bearing Ball', N'BA-8327', 0, 0, NULL, 1000, 750, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'58ae3c20-4f3a-4749-a7d4-d568806cc537', CAST(0x00009A5C00A53CF8 AS DateTime))
INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (3, N'BB Ball Bearing', N'BE-2349', 1, 0, NULL, 800, 600, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'9c21aed2-5bfa-4f18-bcb8-f11638dc2e4e', CAST(0x00009A5C00A53CF8 AS DateTime))
INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (4, N'Headset Ball Bearings', N'BE-2908', 0, 0, NULL, 800, 600, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'ecfed6cb-51ff-49b5-b06c-7d8ac834db8b', CAST(0x00009A5C00A53CF8 AS DateTime))
INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (316, N'Blade', N'BL-2036', 1, 0, NULL, 800, 600, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'e73e9750-603b-4131-89f5-3dd15ed5ff80', CAST(0x00009A5C00A53CF8 AS DateTime))
INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (317, N'LL Crankarm', N'CA-5965', 0, 0, N'Black', 500, 375, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, N'L ', NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'3c9d10b7-a6b2-4774-9963-c19dcee72fea', CAST(0x00009A5C00A53CF8 AS DateTime))
INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (318, N'ML Crankarm', N'CA-6738', 0, 0, N'Black', 500, 375, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, N'M ', NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'eabb9a92-fa07-4eab-8955-f0517b4a4ca7', CAST(0x00009A5C00A53CF8 AS DateTime))

我们的数据库已经准备就绪,现在就创建在Visual Studio中,并与上述数据库的Web API应用程序,然后实体。

如何测试客户端工作中的Web API

创建实体

如果你不知道如何创建解决方案中的一个实体,请阅读这里我刚才提到要遵循该文章中的步骤。一旦你创建了实体,你是好去创造与创造的实体API控制器。如果你这样做,CRUD操作将自动为您创建。您可能需要根据自己的需要来编辑这些行动。

如何测试客户端工作中的Web API

网页API 2控制器的操作,使用实体框架

选择模型类,那么的DbContext命名您的控制器,然后单击确定。我希望能与CRUD操作的控制器。现在,我们可以修改如下。

 using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using ControllerActionDescriptions.Models;

namespace ControllerActionDescriptions.Controllers
{
    public class ProductsController : ApiController
    {
        private TrialsDBEntities db = new TrialsDBEntities();
        #region GetProducts
        /// <summary>
        /// Get all the products available
        /// GET: api/Products
        /// </summary> 
        public IQueryable<Product> GetProducts()
        {
            return db.Products;
        }
        #endregion

        #region GetProductWithParameter
        /// <summary>
        /// Get a single product by id
        /// GET: api/Products/5
        /// <param name="id"></param>
        /// </summary> 
        [ResponseType(typeof(Product))]
        public IHttpActionResult GetProduct(int id)
        {
            Product product = db.Products.Find(id);
            if (product == null)
            {
                return NotFound();
            }

            return Ok(product);
        }
        #endregion
 // PUT: api/Products/5
        [ResponseType(typeof(void))]
        public IHttpActionResult PutProduct(int id, Product product)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != product.ProductID)
            {
                return BadRequest();
            }

            db.Entry(product).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ProductExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);
        }

        // POST: api/Products
        [ResponseType(typeof(Product))]
        public IHttpActionResult PostProduct(Product product)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.Products.Add(product);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (ProductExists(product.ProductID))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DefaultApi", new { id = product.ProductID }, product);
        }

        // DELETE: api/Products/5
        [ResponseType(typeof(Product))]
        public IHttpActionResult DeleteProduct(int id)
        {
            Product product = db.Products.Find(id);
            if (product == null)
            {
                return NotFound();
            }

            db.Products.Remove(product);
            db.SaveChanges();

            return Ok(product);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool ProductExists(int id)
        {
            return db.Products.Count(e => e.ProductID == id) > 0;
        }
    }
}

安装WebApiTestClient

要安装该软件包,请到您的套餐的NuGet软件包管理器管理控制台并运行以下命令。

Install-Package WebApiTestClient

你总是可以得到有关包的细节在这里

一旦你安装包,你可以看到一些文件添加到您的脚本和地区的文件夹前面。

如何测试客户端工作中的Web API

脚本和文件夹区

配置WebApiTestClient

要配置WebApiTestClient,请访问该文件夹Areas->视图 - >帮助,然后点击Api.cshtml

如何测试客户端工作中的Web API

API CSHTML

这是当你点击你的帮助页面每个API显示的视图。现在添加前面的代码块这一观点。

@Html.DisplayForModel("TestClientDialogs")
@section Scripts
{
<link href="~/Areas/HelpPage/HelpPage.css" rel="stylesheet" type="text/css" />
    @Html.DisplayForModel("TestClientReferences")
}
如何测试客户端工作中的Web API

代码块

测试WebApiTestClient

现在运行您的API应用程序并进入帮助页面任何控制器动作,你可以看到底部的按钮称为测试API。如果你点击,你会得到一个弹出,你可以测试你的API的行动。

如何测试客户端工作中的Web API

测试API客户端输出

现在,如果通过单击发送按钮发送您的要求,您会得到如下的输出。

如何测试客户端工作中的Web API

测试API客户端输出与响应之间的

你可以随时给id参数如下。

如何测试客户端工作中的Web API

测试客户端有了参数

你也可以给内容长度和内容类型在您的文章要求如下。

如何测试客户端工作中的Web API

测试客户端后用

如何测试客户端工作中的Web API

测试客户端使用PUT请求

参考

  • 样品测试客户端
  • WebApiTestClient

作者已经张贴在GitHub上的源代码,请查看这里

有一个幸福的编码!

结论

我错过了什么,你可能会认为这是需要的?你会发现这个岗位作为有用吗?我希望你喜欢这篇文章。请分享你我的宝贵建议和反馈。

到你了。你怎么看?

博客是不是没有评论的博客,但会尽力留在话题。如果你有不相关的这个职位的问题,你就要去张贴在C#角,代码项目,堆栈溢出,Asp.Net论坛,而不是在这里评论更好。鸣叫或发邮件给我一个链接到你的问题有,我一定会尽力帮助如果我能。

最亲切的问候
Sibeesh VENU



.net教程阅读排行

最新文章