在xUnit和Visual Studio中,我想将 Test Explorer 中标有[Collection("DB")]
属性的测试分组。我只能通过[Trait("Collection", "DB")]
属性进行分组测试。有没有办法如何为具有Trait
属性的所有测试分配特定的[Collection("DB")]
?
更新:我添加了xUnit问题#799。
答案 0 :(得分:1)
从http://mac-blog.org.ua/xunit-category-trait/复制。
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
using Xunit.Abstractions;
using Xunit.Sdk;
using XunitCategoriesSample.Traits;
namespace XunitCategoriesSample.Traits
{
public class CategoryDiscoverer : ITraitDiscoverer
{
public const string KEY = "Category";
public IEnumerable<KeyValuePair<string, string>> GetTraits(IAttributeInfo traitAttribute)
{
var ctorArgs = traitAttribute.GetConstructorArguments().ToList();
yield return new KeyValuePair<string, string>(KEY, ctorArgs[0].ToString());
}
}
//NOTICE: Take a note that you must provide appropriate namespace here
[TraitDiscoverer("XunitCategoriesSample.Traits.CategoryDiscoverer", "XunitCategoriesSample")]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class CategoryAttribute : Attribute, ITraitAttribute
{
public CategoryAttribute(string category) { }
}
}
namespace XunitCategoriesSample
{
public class Class1
{
[Fact]
[Category("Jobsearcher")]
public void PassingTest()
{
Assert.Equal(4, Add(2, 2));
}
[Fact]
[Category("Employer")]
public void FailingTest()
{
Assert.Equal(5, Add(2, 2));
}
int Add(int x, int y)
{
return x + y;
}
}
}
注意您必须在TraitDiscoverer属性中提供正确的命名空间。
但是更多,让我们制作更专业的属性:
public class JobsearcherTraitDiscoverer : ITraitDiscoverer
{
public const string VALUE = "Jobsearcher";
public IEnumerable<KeyValuePair<string, string>> GetTraits(IAttributeInfo traitAttribute)
{
yield return new KeyValuePair<string, string>(CategoryDiscoverer.KEY, VALUE);
}
}
[TraitDiscoverer("XunitCategoriesSample.Traits.JobsearcherTraitDiscoverer", "XunitCategoriesSample")]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class JobsearcherTraitAttribute : Attribute, ITraitAttribute
{
public JobsearcherTraitAttribute()
{
}
}
因此,从现在开始,您只需输入[JobsearcherTrait]
链接:
https://github.com/xunit/xunit/issues/394 - 讨论为什么将TraitAttribute标记为已密封
https://github.com/xunit/samples.xunit/tree/master/TraitExtensibility - xunit示例如何制作自定义属性
https://github.com/wespday/CategoryTraits.Xunit2 - 再增加一个样本
https://github.com/xunit/xunit/blob/47fdc2669ae6aa28f6d642e202840193dfc7dbd7/test/test.xunit.execution/Common/TraitHelperTests.cs - 实现自定义属性的xunit测试样本
答案 1 :(得分:0)
在 Xunit.Sdk.ITraitDiscoverer 接口中,GetTraits 方法的参数 'traitAttribute' 具有实际的属性值,但不幸的是,这不是直接获取它的方法,因为 Xunit.Abstractions.IAttributeInfo 没有 getter,这很奇怪。这只是另一种没有调用 GetConstructorArguments() 的解决方案
枚举我们需要的确切类别
public enum Category
{
UiSmoke,
ApiSmoke,
Regression
}
自定义属性定义
[TraitDiscoverer("Automation.Base.xUnit.Categories.CategoryDiscoverer", "Automation.Base")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class TestCategoryAttribute : Attribute, ITraitAttribute
{
public string Category { get; }
public TestCategoryAttribute(Category category)
{
Category = category.ToString();
}
}
这里是分类解析器/发现器
public sealed class CategoryDiscoverer : ITraitDiscoverer
{
public const string Key = "Category";
public IEnumerable<KeyValuePair<string, string>> GetTraits(IAttributeInfo traitAttribute)
{
var category = traitAttribute.GetNamedArgument<string>(Key);
yield return new KeyValuePair<string, string>(Key, category);
}
}
这是我们需要知道 TestCategoryAttribute 类型中确切属性名称的捕获,在发现者中它使用 Key 常量定义。
无论如何,GetConstructorArguments() 和 GetNamedArgument() 都是基于反射的,而发现者在每个测试运行时执行一次,这不是那么快。
答案 2 :(得分:-1)
你可以这样做:
enum Collection {
DB,
File,
// Others
}
后来在课堂或方法层面:
[Trait(nameof(Collection), nameof(Collection.DB))]
干净简单