据我了解,在 Visual Studio 2012 Update 1 及更高版本中,单元测试Traits允许我在测试中设置任意键值对。我已经完成了这项工作,但似乎查询语法存在限制,或者我只是遗漏了一些东西。(在 C# 中,看起来 Traits 可以用方法属性指定。在编写自定义单元测试适配器时,我也看到类上的集合存在TestProperty
这个问题。)Traits
Microsoft.VisualStudio.TestPlatform.ObjectModel.TestCase
假设我有一个 trait Priority
,并且它在 set 中有值{1, 2, 3}
。如果我定义了另一个 Trait 或者MyID
也是数字的,并且 2 是一个有效的 ID,我将如何在测试资源管理器中设置一个查询来查找所有优先级为 2 的测试,而无需同时选择 ID 为 2 的测试?我对语法的理解是那些具有优先级且值为 2 的测试的联合,但这似乎会导致冲突
Trait:"Priority" Trait:"2"
我希望有一个像下面这样的语法,它会考虑到 Trait 键和值之间的差异:
Trait:"Priority=2"
有没有办法做到这一点?我有数以万计的测试,其中包含多达 20 个潜在的感兴趣特征,所以如果我不能这样做,我将不得不{P1, P2, P3}
为我可能的优先级以及所有其他特征定义全局唯一值。我正在编写一个自定义单元测试框架,所以如果这是唯一的方法,我可以灵活地做到这一点,但似乎我不应该这样做。
谢谢你。
编辑:这是对C# 示例单元测试项目BankTest 的改编,它显示了冲突的 TestProperty 值:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using BankAccountNS;
namespace BankTest
{
[TestClass]
public class BankAccountTests
{
// unit test code
[TestMethod]
[TestProperty("TestID", "1")]
[TestProperty("Priority", "2")]
public void Debit_WithValidAmount_UpdatesBalance()
{
// arrange
double beginningBalance = 11.99;
double debitAmount = 4.55;
double expected = 7.44;
BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
// act
account.Debit(debitAmount);
// assert
double actual = account.Balance;
Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
}
//unit test method
[TestMethod]
[TestProperty("TestID", "2")]
[TestProperty("Priority", "1")]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
// arrange
double beginningBalance = 11.99;
double debitAmount = -100.00;
BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
// act
account.Debit(debitAmount);
// assert is handled by ExpectedException
}
[TestMethod]
[TestProperty("TestID", "3")]
[TestProperty("Priority", "0")]
public void Debit_WhenAmountIsGreaterThanBalance_ShouldThrowArgumentOutOfRange()
{
// arrange
double beginningBalance = 11.99;
double debitAmount = 20.0;
BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
// act
try
{
account.Debit(debitAmount);
}
catch (ArgumentOutOfRangeException e)
{
// assert
StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
}
}
}
}
在测试资源管理器中,如果您使用过滤器Trait:"TestID" Trait:"2"
,它匹配 Priority=2 和 TestID =2。