如何:为数据库单元测试设计器创建测试条件
本主题适用于:
Visual Studio 旗舰版 |
Visual Studio 高级专业版 |
Visual Studio 2010 专业版 |
Visual Studio 学习版 |
---|---|---|---|
可以使用可扩展的 TestCondition 类创建新的测试条件。 例如,有可能创建一个新的测试条件,用于确认结果集中列或值的数量。
以下过程介绍如何创建测试条件以显示在数据库单元测试设计器中。
创建测试条件
在 Visual Studio 中创建一个类库项目。
在**“项目”菜单上,单击“添加引用”**。
单击**“.NET”**选项卡。
在**“组件名称”列表中,选择“Microsoft.Data.Schema.UnitTesting”和“Microsoft.Data.Schema”,然后单击“确定”**。
从 TestCondition 类派生您的类。
用强名称对程序集进行签名。 有关更多信息,请参见如何:使用强名称为程序集签名。
生成类库。
必须先将经过签名的程序集复制到 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomExtensions 文件夹,其中 CustomExtensions 是您或者您的计算机管理员为容纳功能扩展 XML 文件而创建的文件夹的名称,然后才能使用新的测试条件。
注册测试条件。 有关更多信息,请参见如何:注册和管理功能扩展。
示例
在本示例中,将创建一个简单的测试条件,用于确认结果集中返回的列数符合预期。 可以使用这个简单的测试条件来确保存储过程的协定正确无误。
using System;
using System.Collections.Generic;
using TestTools = Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Data.Schema.UnitTesting;
using Microsoft.Data.Schema.UnitTesting.Conditions;
using Microsoft.Data.Schema.Extensibility;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using Microsoft.Data.Schema;
namespace TeamSystem.Data.Samples.DBUnitTesting
{
[DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.Any)]
[DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.None)]
[DisplayName("ResultSet Column Count")]
public class ResultSetColumnCountCondition : TestCondition
{
private int _resultSet;
private int _count;
private int _batch;
public ResultSetColumnCountCondition()
{
_resultSet = 1;
_count = 0;
_batch = 1;
}
//method you need to override
//to perform the condition verification
public override void Assert(DbConnection validationConnection, ExecutionResult[] results)
{
//call base for parameter validation
base.Assert(validationConnection, results);
//verify batch exists
if (results.Length < _batch)
throw new DataException(String.Format("Batch {0} does not exist", _batch));
ExecutionResult result = results[_batch - 1];
//verify resultset exists
if (result.DataSet.Tables.Count < ResultSet)
throw new DataException(String.Format("ResultSet {0} does not exist", ResultSet));
DataTable table = result.DataSet.Tables[ResultSet - 1];
//actual condition verification
//verify resultset column count matches expected
if (table.Columns.Count != Count)
throw new DataException(String.Format(
"ResultSet {0}: {1} columns did not match the {2} columns expected",
ResultSet, table.Columns.Count, Count));
}
//this method is called to provide the string shown in the
//test conditions panel grid describing what the condition tests
public override string ToString()
{
return String.Format(
"Condition fails if ResultSet {0} does not contain {1} columns",
ResultSet, Count);
}
//below are the test condition properties
//that are exposed to the user in the property browser
#region Properties
//property specifying the resultset for which
//you want to check the column count
[Category("Test Condition")]
[DisplayName("ResultSet")]
[Description("ResultSet Number")]
public int ResultSet
{
get { return _resultSet; }
set
{
//basic validation
if (value < 1)
throw new ArgumentException("ResultSet cannot be less than 1");
_resultSet = value;
}
}
//property specifying
//expected column count
[Category("Test Condition")]
[DisplayName("Count")]
[Description("Column Count")]
public int Count
{
get { return _count; }
set
{
//basic validation
if (value < 0)
throw new ArgumentException("Count cannot be less than 0");
_count = value;
}
}
#endregion
}
}
自定义测试条件的类是从 TestCondition 基类继承的。 由于自定义测试条件具有其他属性,因此用户可以在注册自定义测试条件之后从**“属性”**窗口中配置该条件。
在本示例中,将添加两个属性。 自定义测试条件的用户可以使用**“ResultSet”属性来指定应当检验哪个结果集内的列数。 然后,用户可以使用“Count”**属性指定预期的列计数。
针对每个属性添加了以下三个特性:
类别名称(有助于对属性进行组织)。
属性的显示名称。
属性的说明。
针对这些属性执行了一些基本的验证,以确认**“ResultSet”属性的值不小于一,而且“Count”**属性的值大于零。
Assert 方法执行测试条件的主要任务。 可以重写 Assert 方法以验证是否符合预期的条件。 此方法提供两个参数:
第一个参数是用来检验测试条件的数据库连接。
第二个也是更重要的参数是 results 数组,它为所执行的每个批次都返回一个数组元素。
每个测试脚本仅支持一个批次。 因此,测试条件将总是检查第一个数组元素。 数组元素中包含数据集,数据集内又包含测试脚本的返回结果集。 本示例中的代码检查数据集内的数据表是否包含适当的列数。 有关更多信息,请参见 DataSet。
您必须设置一个类库,而且该类库中必须包含要签名的测试条件。签名操作可在**“签名”**选项卡上的项目属性中执行。