在您的NUnit安裝和TearDown方法中,您需要刪除並在數據庫中創建指定的表(使用腳本)。所以,之前和之後你的每個測試運行,所有的數據都會的,當然被刪除留下您測試只空表。
下面的示例使用MySql數據庫,但即使是其他數據庫,代碼應該是很相似的:
public class DatabaseCleanup
{
private string _connectionString;
private MySqlConnection _mySqlConnection;
private string _filePath;
public DatabaseCleanup()
{
_filePath = @"C:\createdatabase.sql";
_connectionString = @"Server=localhost;Port=3306;Database=dbname;Uid=username;Password=password;";
_mySqlConnection = new MySqlConnection(_connectionString);
}
public void Create()
{
string script = File.ReadAllText(_filePath);
ExecuteScript(script);
}
private void ExecuteScript(string script)
{
try
{
MySqlCommand command = new MySqlCommand(script, _mySqlConnection);
_mySqlConnection.Open();
command.ExecuteNonQuery();
_mySqlConnection.Close();
}
catch (Exception exception)
{
throw;
}
finally
{
_mySqlConnection.Close();
}
}
}
在上面的代碼中提到的腳本createdatabase.sql
就是一個包含刪除表的SQL文件,並創建表語句,你可以根據你的數據庫提供。下面就是一個例子:
DROP TABLE IF EXISTS `my_table`;
CREATE TABLE `my_table` (
`Id` varchar(50) NOT NULL,
`Name` varchar(50) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然後,您可以使用DatabaseCleanup類在NUnit測試類的安裝和拆卸方法:
DatabaseCleanup databaseCleanup = new DatabaseCleanup();
databaseCleanup.Create();
要小心,不要運行在生產環境中,此數據庫清理代碼。僅在開發和測試環境中運行此類測試。
P.S.,我不喜歡人們在這裏說使用像SqlLite這樣的內存數據庫。這完全破壞了整合測試的全部目的。這意味着在開發環境中使用不同的數據庫測試代碼,然後在生產服務器上的不同數據庫平臺上部署和部署;然後面對噩夢!
我們嘗試了SQL服務器CE並遇到了許多兼容性問題(某些功能不受CE支持)。現在我們正在使用SQLite沒有問題。 – Zebi 2011-03-19 17:46:48
SQLLite可以完成同樣的事情。這裏描述:http://jasondentler.com/blog/2009/08/nhibernate-unit-testing-with-sqlite-in-memory-db/。所描述的方法的缺點是每次SQLiteDatabaseScope被實例化時都必須構建數據庫......並且需要很長時間。 – 2011-03-19 17:57:06
我們正在使用一個專門的測試會話工廠,它是爲我們的測試而創建的,並保留到所有測試運行(使用自定義提供程序覆蓋關閉連接方法而不執行任何操作)。 – Zebi 2011-03-19 18:01:37