欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测

程序员文章站 2022-06-11 15:26:28
...

解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against-multiple-sql-server-versions/ 自从我发布了OrcaMDF Studio,我已经意识到SQL2005和SQL2008之间的一些系统表的差异。 这些差异

解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

http://improve.dk/automated-testing-of-orcamdf-against-multiple-sql-server-versions/

自从我发布了OrcaMDF Studio,我已经意识到SQL2005和SQL2008之间的一些系统表的差异。

这些差异导致OrcaMDF 解析失败因为代码是针对 2008 R2的格式的

当需要做SQL2005的兼容时,我渐渐意识到我需要扩大多个SQLSERVER版本的测试覆盖,替代之前的只对一个版本的测试。

而且,我也需要对一些特定版本功能进行特定的测试(例如:稀疏列测试只能运行在SQLSERVER2008及以上版本)

NUnit TestCaseSourceAttribute 解决问题

NUnit支持通过TestCase属性进行内联参数测试。更好的是,对于动态测试用例我们还可以提供参数数据,使用TestCaseSource属性,使用TestCaseSource attribute。

首先,我实现了一个简单的枚举来覆盖我目前工作所支持的版本:

public enum DatabaseVersion
{
    SqlServer2005,
    SqlServer2008,
    SqlServer2008R2,
}

然后我创建SqlServerTestAttribute类,直接继承自TestCaseSourceAttribute,就像这样:

public class SqlServerTestAttribute : TestCaseSourceAttribute
{
    private static IEnumerable versions
    {
        get
        {
            foreach (var value in Enum.GetValues(typeof(DatabaseVersion)))
                yield return new TestCaseData(value).SetCategory(value.ToString());
        }
    }

    public SqlServerTestAttribute() : base(typeof(SqlServerTestAttribute), "versions")
    { }
}

这个SqlServerTestAttribute类告诉TestCaseSourceAttribute 在私有静态的版本属性(private static)里去找测试用例的源数据。

版本属性里枚举出所有的DatabaseVersion值并一个接一个的返回它们——确保将测试类别设置到DatabaseVersion值的名称


接下来,我将当前的测试转换为使用新的SqlServerTest attribute,替代先前的vanilla NUnit Test attribute:

[SqlServerTest]
public void HeapForwardedRecord(DatabaseVersion version)
{
    ...
}

这将导致我所有的测试都需要根据DatabaseVersion枚举里面的每个枚举值都运行一次,自动获取输入的版本参数里面的每一个值



支持不同的开发环境
现在,我不想强迫每个人都安装所有版本的SQL Server--他们可能只是想软件支持SQL Server 2005 & 2008R2就够了。在OrcaMDF.Core.Tests项目里,我定义了每种受支持的测试数据库的连接字符串,就像这样

"