通过回滚NUnit,Sql Server和UI测试中的事务来维护数据库已知状态的正确方法

Sai*_*fur 5 c# sql sql-server selenium coded-ui-tests

我正在尝试为UI测试自动化执行以下操作:

[SetUp]
public void TestSetUp()
{
    _scope = new TransactionScope();
}

[TearDown]
public void TearDown()
{
    _scope.Dispose();
}

[Test]
public void SomeTest()
{
    Utilities.SomeDeleteTransaction(companyCode);    
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试执行一个Update查询并在[Test]中执行一些操作,并在测试后运行的[TearDown]中执行UI和回滚事务.我不确定我做得对.但是,我正在尝试(可能提交)该事务,以便我可以看到它对UI的影响和回滚相同的事务,所以我的数据库保持不变.我可以使用TransactionScope或其他类来实现吗?

编辑

这个问题主要是处理数据库已知的硒测试状态.由于我的数据库每月从生产中删除,我希望能够在测试之前执行一些insert/update/delete sql脚本来修改db,然后使用Selenium进行一些UI测试,然后在Teardown中回滚(测试是使用NUnit编写的) )确保db对测试没有任何影响,并在测试后保持相同.

myc*_*gus 6

数据库快照!

保存此脚本并将其命名为"create_db_snapshot.sql"

/* Create a database snapshot */

USE master;
CREATE DATABASE Your_Database_Snapshot ON
( 
    NAME = Your_Database, 
    FILENAME = 'C:\Snapshots\Your_Database_Snapshot.ss' 
)
AS SNAPSHOT OF Your_Database;
GO
Run Code Online (Sandbox Code Playgroud)

另外,保存此脚本并将其命名为"restore_db_from_snapshot.sql"

USE master;
RESTORE DATABASE Your_Database from 
DATABASE_SNAPSHOT = 'Your_Database_Snapshot';
GO
Run Code Online (Sandbox Code Playgroud)

例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.IO;
using System.Data.SqlClient;

[SetUp]
public void TestSetUp()
{
    string sqlConnectionString = @"server=test.database.com;uid=your_db_username;pwd=your_db_password;database=Your_Database;";

    string script = File.ReadAllText(@"~/create_db_snapshot.sql");
    SqlConnection conn = new SqlConnection(sqlConnectionString);

    Server server = new Server(new ServerConnection(conn));
    server.ConnectionContext.ExecuteNonQuery(script);
}


[TearDown]
public void TearDown()
{
    string sqlConnectionString = @"server=test.database.com;uid=your_db_username;pwd=your_db_password;database=Your_Database;";

    string script = File.ReadAllText(@"~/restore_db_from_snapshot.sql");
    SqlConnection conn = new SqlConnection(sqlConnectionString);

    Server server = new Server(new ServerConnection(conn));
    server.ConnectionContext.ExecuteNonQuery(script);
}
Run Code Online (Sandbox Code Playgroud)

快照文档:https://msdn.microsoft.com/en-us/library/ms175158.aspx

执行.sql文件的代码信用:https://stackoverflow.com/a/1728859/3038677

您可能还需要在执行restore_db_from_snapshot.sql之前运行此脚本...

/* Kill all current connections to Your_Database */

use master;
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('Your_Database')
Run Code Online (Sandbox Code Playgroud)

  • 在恢复之前,只需将数据库置于单用户模式即可.这样你就不需要杀死任何东西了. (3认同)