public class FactAttribute : Attribute
{
public FactAttribute();
public virtual string DisplayName { get; set; }
public virtual string Skip { get; set; }
public virtual int Timeout { get; set; }
}
[Fact(Timeout = 50)]
public void Test1()
{
Task.Delay(100).Wait();
}
[Fact(Timeout =50)]
public async Task Test2()
{
await Task.Delay(100);
}
[Fact(Timeout = 50)]
public async Task Test3()
{
await Task.Delay(20);
}
以下是运行的结果
1.2 TraitAttribute
Trait属性用来标识不同的特性分组,可用于标识class和method
示例
目前有两个测试类UnitTest1,UnitTest2
public class UnitTest1
{
[Fact]
public void Test1()
{
}
[Fact]
public void Test2()
{
}
[Fact]
public void Test3()
{
}
}
public class UnitTest2
{
[Fact]
public void Test1()
{
}
[Fact]
public void Test2()
{
}
}
[Trait("trait1","item1")]
public class UnitTest1
{
[Fact]
public void Test1()
{
}
[Fact]
[Trait("trait2","item2")]
public void Test2()
{
}
[Fact]
[Trait("trait3","item3")]
public void Test3()
{
}
}
[Trait("trait2","item2")]
public class UnitTest2
{
[Fact]
public void Test1()
{
}
[Fact]
[Trait("trait3","item3")]
public void Test2()
{
}
}
public abstract class DataAttribute : Attribute
{
///
/// Marks all test cases generated by this data source as skipped.
///
public virtual string Skip {get;set;}
///
/// Returns the data to be used to test the theory.
///
public abstract IEnumerable
public class UnitTest1
{
public static IEnumerable
运行结果:
1.4.2.2从Field中获取数据
例子如下:
public static IEnumerable FileData = new List
{ new object[]{ 1,2,3,},new object[]{4,5,6 } };
[Theory]
[MemberData(nameof(FileData))]
public void Test1(int num1, int num2,int num3)
{
Assert.Equal(num1+num2, num3);
}
运行结果如下
1.4.2.3从method中获取数据
例子如下:
public static IEnumerable GetData()
{
return new List { new object[] { true },new object[] { false } };
}
[Theory]
[MemberData(nameof(GetData))]
public void Test1(bool condition)
{
Assert.True(condition);
}
运行结果:
1.4.3 继承DataAttribute的自定义class
可以自定义继承DataAttribute的数据类,实现GetData方法即可,供多个类使用。
例子如下:
public class TestData : DataAttribute
{
public override IEnumerable GetData(MethodInfo testMethod)
{
return new List { new object[] { true }, new object[] { false } };
}
}
public class UnitTest1
{
[Theory]
[TestData]
public void Test1(bool condition)
{
Assert.True(condition);
}
}
public class UnitTest2
{
[Theory]
[TestData]
public void Test1(bool condition)
{
Assert.True(condition);
}
}
运行结果如下:
1.4.4ClassDataAttribute
ClassDataAttribute用于获取测试数据源,其用法为传入一个数据源的type
public class ClassDataAttribute : DataAttribute
{
public ClassDataAttribute(Type @class);
public Type Class { get; }
public override IEnumerable GetData(MethodInfo testMethod);
}
1.4.4.1从TheoryData中获取数据源
TheoryData可以有0-10个参数可供选择
例子如下:
public class TestData : TheoryData
{
///在构造函数内添加数据
public TestData()
{
Add(1, 1);
Add(1, 2);
}
}
[Theory]
[ClassData(typeof(TestData))]
public void Test1(int num1,int num2)
{
Assert.Equal(num1, num2);
}
1.4.4.2从继承IEnumerable的自定义class获取数据源
自定义实现IEnumerable的类
例子如下:
public class TestIEnumerableData : IEnumerable
{
private readonly List _data = new List
{
new object[] { true }, new object[] { false }
};
public IEnumerator GetEnumerator() => _data.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
[Theory]
[ClassData(typeof(TestData))]
public void Test1(int num1,int num2)
{
Assert.Equal(num1, num2);
}
public sealed class CollectionAttribute : Attribute
{
public CollectionAttribute(string name);
}
例子如下:
设置3个测试类,每个类里边有2个测试用例
public class UnitTest1
{
[Fact]
public void Test1()
{
Thread.Sleep(1000);
}
[Fact]
public void Test2()
{
Thread.Sleep(2000);
}
}
public class UnitTest2
{
[Fact]
public void Test1()
{
Thread.Sleep(2000);
}
[Fact]
public void Test2()
{
Thread.Sleep(2000);
}
}
public class UnitTest3
{
[Fact]
public void Test1()
{
Thread.Sleep(1000);
}
[Fact]
public void Test2()
{
Thread.Sleep(2000);
}
}
[Collection("group1")]
public class UnitTest1
{
[Fact]
public void Test1()
{
Thread.Sleep(1000);
}
[Fact]
public void Test2()
{
Thread.Sleep(2000);
}
}
[Collection("group1")]
public class UnitTest2
{
[Fact]
public void Test1()
{
Thread.Sleep(2000);
}
[Fact]
public void Test2()
{
Thread.Sleep(2000);
}
}
[Collection("group2")]
public class UnitTest3
{
[Fact]
public void Test1()
{
Thread.Sleep(1000);
}
[Fact]
public void Test2()
{
Thread.Sleep(2000);
}
}
运行结果如下
2.Log
有一个ITestOutputHelper用来输出自定义信息,使用时在构造函数内加入即可
public interface ITestOutputHelper
{
//直接输出
void WriteLine(string message);
//按格式输出
void WriteLine(string format, params object[] args);
}
例子如下:
public class UnitTest1
{
private readonly ITestOutputHelper _outputHelper;
public UnitTest1(ITestOutputHelper testOutputHelper)
{
_outputHelper = testOutputHelper;
}
[Fact]
public void Test2()
{
_outputHelper.WriteLine("log output");
}
}