[聚合文章] 使用xUnit为.net core程序进行单元测试(中)

.Net 2018-01-16 28 阅读

第一部分: http://www.cnblogs.com/cgzl/p/8283610.html

下面有一点点内容是重叠的....

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的:

Assert Null值

        [Fact]        public void NotHaveNameByDefault()        {            var plumber = new Plumber();            Assert.Null(plumber.Name);        }        [Fact]        public void HaveNameValue()        {            var plumber = new Plumber            {                Name = "Brian"            };            Assert.NotNull(plumber.Name);        }

有两个方法, Assert.Null 和 Assert.NotNull, 直接传入期待即可.

测试会Pass的.

集合 Collection 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 List<string> Tools { get; set; }    }    public class Plumber : Worker    {        public Plumber()        {            Tools = new List<string>()            {
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。