使用xUnit为.net core程序进行单元测试(中)

发表于:2018-1-17 13:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:solenovex    来源:51Testing软件测试网采编

  下面有一点点内容是重叠的....
  String Assert
  测试string是否相等:
          [Fact]
          public void CalculateFullName()
          {
              var p = new Patient
              {
                  FirstName = "Nick",
                  LastName = "Carter"
              };
              Assert.Equal("Nick Carter", p.FullName);
          }
  然后你需要Build一下,这样VS Test Explorer才能发现新的test。
  运行测试,结果Pass:
  同样改一下Patient类(别忘了Build一下),让结果失败:
  从失败信息可以看到期待值和实际值。
  StartsWith, EndsWith
          [Fact]
          public void CalculateFullNameStartsWithFirstName()
          {
              var p = new Patient
              {
                  FirstName = "Nick",
                  LastName = "Carter"
              };
              Assert.StartsWith("Nick", p.FullName);
          }
          [Fact]
          public void CalculateFullNameEndsWithFirstName()
          {
              var p = new Patient
              {
                  FirstName = "Nick",
                  LastName = "Carter"
              };
              Assert.EndsWith("Carter", p.FullName);e);
          }
  Build,然后Run Test,结果Pass:
  忽略大小写 ignoreCase:
  string默认的Assert是区分大小写的,这样就会失败:
  可以为这些方法添加一个参数ignoreCase设置为true,就会忽略大小写:
  包含子字符串 Contains
          [Fact]
          public void CalculateFullNameSubstring()
          {
              var p = new Patient
              {
                  FirstName = "Nick",
                  LastName = "Carter"
              };
              Assert.Contains("ck Ca", p.FullName);
          }
  Build,测试结果Pass。
  正则表达式,Matches
  测试一下First name和Last name的首字母是不是大写的:
          [Fact]
          public void CalculcateFullNameWithTitleCase()
          {
              var p = new Patient
              {
                  FirstName = "Nick",
                  LastName = "Carter"
              };
              Assert.Matches("[A-Z]{1}{a-z}+ [A-Z]{1}[a-z]+", p.FullName);
          }
  Build,测试通过。
  数值 Assert
  首先为Patient类添加一个property: BloodSugar。
      public class Patient
      {
          public Patient()
          {
              IsNew = true;
              _bloodSugar = 5.0f;
          }
          private float _bloodSugar;
          public float BloodSugar
          {
              get { return _bloodSugar; }
              set { _bloodSugar = value; }
          }
          ...
  Equal:
          [Fact]
          public void BloodSugarStartWithDefaultValue()
          {
              var p = new Patient();
              Assert.Equal(5.0, p.BloodSugar);
          }
  Build,测试通过。
  范围, InRange:
  首先为Patient类添加一个方法,病人吃饭之后血糖升高:
          public void HaveDinner()
          {
              var random = new Random();
              _bloodSugar += (float)random.Next(1, 1000) / 100; //  应该是1000
          }
  添加test:
          [Fact]
          public void BloodSugarIncreaseAfterDinner()
          {
              var p = new Patient();
              p.HaveDinner();
              // Assert.InRange<float>(p.BloodSugar, 5, 6);
              Assert.InRange(p.BloodSugar, 5, 6);
          }
  Build,Run Test,结果Fail:
  可以看到期待的Range和实际的值,这样很好。如果你使用Assert.True(xx >= 5 && xx <= 6)的话,错误信息只能显示True或者False。
  因为HaveDinner方法里,表达式的分母应该是1000,修改后,Build,Run,测试Pass。
  浮点型数值的Assert
  在被测项目添加这两个类:
  namespace Hospital
  {
      public abstract class Worker
      {
          public string Name { get; set; }
          public abstract double TotalReward { get; }
          public abstract double Hours { get; }
          public double Salary => TotalReward / Hours;
      }
      public class Plumber : Worker
      {
          public override double TotalReward => 200;
          public override double Hours => 3;
      }
  }
  然后针对Plumber建立一个测试类 PlumberShould.cs, 并建立第一个test:
  namespace Hospital.Tests
  {
      public class PlumberShould
      {
          [Fact]
          public void HaveCorrectSalary()
          {
              var plumber = new Plumber();
              Assert.Equal(66.666, plumber.Salary);
          }
      }
  }
  Build项目, 然后再Test Explorer里面选择按Class分类显示Tests:
  Run Selected Test, 结果会失败:
  这是一个精度的问题.
  在Assert.Equal方法, 可以添加一个precision参数, 设置精度为3:
          [Fact]
          public void HaveCorrectSalary()
          {
              var plumber = new Plumber();
              Assert.Equal(66.666, plumber.Salary, precision: 3);
          }
  Build, Run Test:
  因为有四舍五入的问题, 所以test仍然fail了.
  所以还需要改一下:
          [Fact]
          public void HaveCorrectSalary()
          {
              var plumber = new Plumber();
              Assert.Equal(66.667, plumber.Salary, precision: 3);
          }
  这次会pass的:


相关文章
使用xUnit为.net core程序进行单元测试


上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号