我在C#中编写了xUnit测试用例。该测试类包含很多方法。我需要按顺序运行整个测试用例。如何在xUnit中设置测试用例序列?
答案 0 :(得分:29)
在xUnit 2. *中,可以使用TestCaseOrderer
属性来指定排序策略,该策略可用于引用在每个测试中注释的属性以表示订单。
例如:
订购策略
[assembly: CollectionBehavior(DisableTestParallelization = true)]
public class PriorityOrderer : ITestCaseOrderer
{
public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
{
var sortedMethods = new SortedDictionary<int, List<TTestCase>>();
foreach (TTestCase testCase in testCases)
{
int priority = 0;
foreach (IAttributeInfo attr in testCase.TestMethod.Method.GetCustomAttributes((typeof(TestPriorityAttribute).AssemblyQualifiedName)))
priority = attr.GetNamedArgument<int>("Priority");
GetOrCreate(sortedMethods, priority).Add(testCase);
}
foreach (var list in sortedMethods.Keys.Select(priority => sortedMethods[priority]))
{
list.Sort((x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.TestMethod.Method.Name, y.TestMethod.Method.Name));
foreach (TTestCase testCase in list)
yield return testCase;
}
}
static TValue GetOrCreate<TKey, TValue>(IDictionary<TKey, TValue> dictionary, TKey key) where TValue : new()
{
TValue result;
if (dictionary.TryGetValue(key, out result)) return result;
result = new TValue();
dictionary[key] = result;
return result;
}
}
<强>属性强>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class TestPriorityAttribute : Attribute
{
public TestPriorityAttribute(int priority)
{
Priority = priority;
}
public int Priority { get; private set; }
}
测试用例
[TestCaseOrderer("FullNameOfOrderStrategyHere", "OrderStrategyAssemblyName")]
public class PriorityOrderExamples
{
[Fact, TestPriority(5)]
public void Test3()
{
// called third
}
[Fact, TestPriority(0)]
public void Test2()
{
// called second
}
[Fact, TestPriority(-5)]
public void Test1()
{
// called first
}
}
xUnit 2. *订购样品here
答案 1 :(得分:19)
Testpriority:位于this页面的底部。
[PrioritizedFixture]
public class MyTests
{
[Fact, TestPriority(1)]
public void FirstTest()
{
// Test code here is always run first
}
[Fact, TestPriority(2)]
public void SeccondTest()
{
// Test code here is run second
}
}
顺便说一下,我现在遇到同样的问题。是的,这不是一个干净的艺术..但QA想要一个手动测试..所以具有特定订单的自动测试已经是他们的一个重大飞跃..(咳嗽)是的,它不是真正的单元测试..
答案 2 :(得分:1)
你不能,按设计。它是故意随机的,以防止任何人通过欲望或意外获得其中任何一个。
随机性仅适用于给定的Test类,因此您可以通过包装要控制嵌套类内部顺序的项目来实现目标 - 但在这种情况下,您仍然可以随机使用只要在一个类中有两个以上的测试方法,就可以订购。
如果您正在尝试管理灯具或上下文的构建,则内置的IUseFixture<T>
机制可能是合适的。有关示例,请参阅xUnit Cheat Sheet。
但你真的需要告诉我们更多关于你要做什么的事情,否则我们只需要投机。
答案 3 :(得分:0)
如果您确实需要确定测试的优先级(可能不需要单元测试),则可以使用Xunit.Priority。 我已经将它用于一些集成测试,并且在简单的情况下,确实工作得很好且简单,而无需编写优先级类的开销
答案 4 :(得分:0)
出于某种原因,XUnit.Priority
对我不起作用。在我的测试用例中,它没有按照指定的优先级顺序运行测试。
所以我尝试了 XUnitPriorityOrderer
,它与 use 类似,但有效(为了快速测试它,将以下代码在文本编辑器中保存为 OrderedXUnitTests.linq,然后使用 LinqPad 6 打开并执行或者,您也可以将 TestClass 复制到 Visual Studio 并添加 XUnit、XUnit.Runner.VisualStudio 和 XUnitPriorityOrderer):
<Query Kind="Program">
<NuGetReference>XUnitPriorityOrderer</NuGetReference>
<Namespace>Xunit</Namespace>
<Namespace>XUnitPriorityOrderer</Namespace>
</Query>
#load "xunit"
// using XUnitPriorityOrderer
// see: https://github.com/frederic-prusse/XUnitPriorityOrderer
void Main()
{
RunTests(); // Call RunTests() or press Alt+Shift+T to initiate testing.
}
#region private::Tests
[TestCaseOrderer(CasePriorityOrderer.TypeName, CasePriorityOrderer.AssembyName)]
public class TestClass
{
static List<string> Order { get; set; }
public TestClass()
{
Order = Order ?? new List<string>();
}
[Fact, Order(2)]
void Test_Xunit_AnotherTest()
{
Order.Add("Test_Xunit_AnotherTest");
Assert.True(3 + 1 == 4);
}
[Fact, Order(1)]
void Test_Xunit()
{
Order.Add("Test_XUnit");
Assert.True(1 + 1 == 2);
}
[Fact, Order(99)]
void Print_Order()
{
Order.Add("Print_Order");
var strOrder = string.Join(", ", Order.ToArray());
strOrder.Dump("Execution Order");
Assert.True(true);
}
}
#endregion
这将按给定的顺序运行测试(Order(1)、Order(2) 和 Order(99)),并最终转储已执行的测试(测试方法 Print_Order())。