如何在Visual Studio 2013中为多个sql单元测试编写“预测试”?

时间:2014-04-22 08:20:33

标签: sql sql-server visual-studio unit-testing

目前,sql单元测试包含5个部分:

- Pre-Initialise
- Pre-Test
- Test
- Post-Test
- Post-Cleanup

对于我的一些测试,“预测试”部分是相同的,我必须多次复制粘贴预测试代码,代码重复是一个坏主意...所以我的问题是,如果有任何通过在单元测试项目中调用函数来将预测试只编写一次并运行它的方法吗?

我当前的C#文件示例在我的测试用例之后:

[TestClass()]
public class SqlServerUnitTestAssignUserToAssignment : SqlDatabaseTestClass
{
  private TransactionScope trans;

  public SqlServerUnitTestAssignUserToAssignment()
  {
    InitializeComponent();
  }

  [TestInitialize()]
  public void TestInitialize()
  {
    trans = new TransactionScope();
    base.InitializeTest();
  }
  [TestCleanup()]
  public void TestCleanup()
  {
    base.CleanupTest();
    trans.Dispose();
  }

  // generated code below:

  Designer support code

  Additional test attributes

  [TestMethod()]
  public void core_AssignUserToAssignmentTest()...

  private Sql DatabaseTestActions core_AssignUserToAssignmentTestData
}

2 个答案:

答案 0 :(得分:5)

这个难题的两个部分是:

  • 每个类“Common Scripts”:如果您需要在给定测试类中的所有测试之前或之后运行公共代码,只需将SQL放入 使用Designer的该类的常用脚本。

  • 基类测试初始值设定项:如果您需要在给定项目(或解决方案)中的所有测试之前或之后运行公共代码, 像这样创建一个新的基类,并使每个测试类派生自 它

-

public class MySqlTestsBase : SqlDatabaseTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
        PrivilegedContext = TestService.OpenPrivilegedContext();

        CleanupTables();

        //"Common Scripts" are run
        base.InitializeTest(); 
    }

    [TestCleanup]
    public void TestCleanup()
    {
        CleanupTables();

        base.CleanupTest();
    }

    /// <summary>
    /// Deletes data from all tables that tests might have affected.
    /// </summary>
    private void CleanupTables()
    {
        TestService.Execute(PrivilegedContext, PrivilegedContext, new SqlDatabaseTestAction
        {
            SqlScript = @"
                DELETE CustomerOrder
                DELETE Customer
                DELETE Order
            "
        });
    }
}

答案 1 :(得分:0)

这是你如何listen to your tests的一个很好的例子,让它们影响你的系统设计。 (所以我希望我能做到公道。)

你说:

  

所以我的问题是,是否有办法只在一个地方编写预测试,并通过调用单元测试项目中的函数来运行它?

想象一下,您可以将这个预测试代码合并到一个辅助函数中,然后您可以在测试项目中调用它。这解决了测试的问题......但是你的代码的其他消费者呢?他们也不会从这种整合中受益吗?

将我们的测试视为代码的常规消费者是有帮助的。在this post about TDD,“鲍勃叔叔”马丁说(强调我的):

  

您是否曾将第三方库集成到您的项目中?你有一本很棒的文档手册。最后有一个很薄的附录示例。你读过这两个中的哪一个?当然是这样的例子!这就是单元测试的内容!它们是文档中最有用的部分。 它们是如何使用代码的活生生的例子。

如果您的测试告诉您需要boilerplate code才能开始,他们会告诉您所有人需要此样板代码。

将这些重复的代码重构为正式的类(或类)之后,这些测试可以使用该代码执行必要的初始化/清理 - 就像您最初的目标一样。但现在系统的其他部分也从这项工作中受益。