51Testing软件测试论坛

标题: webAPI xUnit单元测试 [打印本页]

作者: 姿态    时间: 2019-4-12 17:15
标题: webAPI xUnit单元测试

通常我们在编码完成功能后,都需要进行单元测试,编写单元测试的好处在于有助于代码维护。

一、测试框架MSTest与xUnit比较特性比较
MSTest        xUnit        备注
[TestClass]        无        标记为测试类
[TestMethod]        [Fact]        标记为测试方法
[ExpectedException]        Assert.Throws        期望抛出异常
[TestInitialize]        Constructor        在每个测试方法执行之前用于初始化的方法
[TestCleanup]        IDisposable.Dispose        在每个测试方法执行之前用于结束的方法
[ClassInitialize]        IUseFixture<T>        在所有测试方法执行之前用于初始化的方法
[Ignore]        [Fact(Skip="reason")]        跳过测试设置
[Timeout]        [Fact(Timeout=n)]        用于指定被测试方法的最大执行时间(单位毫秒),若超过指定的标记时间,则被认为测试失败
[TestProperty]        [Trait]        设置任意的测试数据
[DataSource]        [Theory], [XxxData]        理论上的数据驱动测试
断言比较
MSTest        xUnit        备注
AreEqual        Equal        相等比较
AreNotEqual        NotEqual        不相等比较
AreNotSame        NotSame        不相同比较
AreSame        Same        相同比较
Contains (on CollectionAssert)        Contains        包含比较
DoesNotContain (on CollectionAssert)
DoesNotContain        不包含比较
无       
DoesNotThrow
不抛出异常
Fail        无        失败
Inconclusive        无         
无        InRange        在范围内
无        IsAssignableFrom         
无        Empty         
IsFalse        False         
IsInstanceOfType        IsType         
IsNotInstanceOfType        IsNotType         
IsNotNull
NotNull         
IsNull        Null         
IsTrue        True         
无        NotInRange        不在范围内
无        Throws        抛出异常



二、webAPI 创建xUnit单元测试

1、使用VSCode创建webAPI项目(命令 dotnet new webapi)

2、使用VSCode创建xunit项目(命令 dotnet new xunit)

3、xunit 项目添加对webAPI项目的引用

4、单元测试代码示例



  1. using System;
  2. using System.Collections.Generic;
  3. using Microsoft.AspNetCore.Mvc;
  4. using UnitTestCommonLib;
  5. using UnitTestWebAPI.Controllers;
  6. using Xunit;

  7. namespace WebAPIUnitTest
  8. {
  9.         [Collection("Sequential")]
  10.         public class ClerkUnitTest
  11.         {
  12.                 CommonHelper commonHelper = new CommonHelper();
  13.                 ClerkEntities clerkEntities = new ClerkEntities();

  14.                 /// <summary>
  15.                 /// test GetClerkList
  16.                 /// </summary>
  17.                 [Fact]
  18.                 public void GetClerkList()
  19.                 {
  20.                         //create test data for CSB004
  21.                         var clerkList = new List<CSB004>
  22.                         {
  23.                                 new CSB004 { Ucode = "000000000001", ClkCode = "0000000001", ClkName = "clkname1", ClkGrpCode = "000001", DrawerNumber = "1", ClkIntCode = "000001", NbchkNumFrom = "000001", NbchkNumTo = "000009", Unusable = "0", CreateDateTime = DateTime.UtcNow.ToString ("yyyyMMddHHmmss"), UpdateDateTime = "" },
  24.                                 new CSB004 { Ucode = "000000000001", ClkCode = "0000000002", ClkName = "clkname2", ClkGrpCode = "000001", DrawerNumber = "1", ClkIntCode = "000001", NbchkNumFrom = "000001", NbchkNumTo = "000009", Unusable = "0", CreateDateTime = DateTime.UtcNow.ToString ("yyyyMMddHHmmss"), UpdateDateTime = "" },
  25.                                 new CSB004 { Ucode = "000000000002", ClkCode = "0000000002", ClkName = "clkname2", ClkGrpCode = "000001", DrawerNumber = "1", ClkIntCode = "000001", NbchkNumFrom = "000001", NbchkNumTo = "000009", Unusable = "0", CreateDateTime = DateTime.UtcNow.ToString ("yyyyMMddHHmmss"), UpdateDateTime = "" }
  26.                         };
  27.                         clerkEntities.csb004.AddRange(clerkList);
  28.                         clerkEntities.SaveChanges();
  29.                         //create test examples
  30.                         var testcol = new GetClerkListController();
  31.                         GetClerkListController.InputModel input = new GetClerkListController.InputModel();
  32.                         // data exist
  33.                         input.Ucode = "000000000001";
  34.                         var actualValue = testcol.GetClerkList(input);
  35.                         var actualModel = JsonHelper.JsonToEntity<CommonHelper.ReturnInfo>(actualValue);
  36.                         //No data exist -No data in CSB004
  37.                         input.Ucode = "000000000003";
  38.                         var actualValue1 = testcol.GetClerkList(input);
  39.                         // when ucode is empty
  40.                         input.Ucode = "";
  41.                         var actualValue2 = testcol.GetClerkList(input);
  42.                         var actualModel2 = JsonHelper.JsonToEntity<CommonHelper.ReturnInfo>(actualValue2);
  43.                         //clear test data
  44.                         clerkEntities.csb004.RemoveRange(clerkList);
  45.                         clerkEntities.SaveChanges();
  46.                         //verify
  47.                         Assert.NotNull(actualValue);
  48.                         Assert.Equal(CommonHelper.ERROR_CORRECT, actualModel.errorcode);
  49.                         Assert.Equal(commonHelper.ReturnCodeMessage(CommonHelper.ERROR_NORECORD), actualValue1);
  50.                         Assert.Equal(CommonHelper.ERROR_REQUIRED, actualModel2.errorcode);
  51.                         Assert.Equal("Ucode", actualModel2.maininfo);
  52.                 }
复制代码
5、注:测试类中的[Collection("Sequential")]标注,防止同一个单元测试项目中,不同测试类中的不同测试方法在测试运行时,出现数据冲突,造成测试失败






欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2