Menu

谈一下我们是怎么做数据库单元测试(Database Unit Test)的 – HarlanC

0 Comment

作者对公众不完整开放的程度,即使有不义的行为或不义的行为,请点明,谢谢你。

围绕引见

近的,在协同工作放开以前回归,把充足的feature业务或活动范围merge回master晚年的显示证据DB的单元测试法涌现了20多个倒闭的test cases。以前不做DB单元测试法,供给诱惹这事机遇,就可以熟识WRITI的停止。。

本视频博客率先引见了如安在假定使突出视力中安排DB。 单元测试法组织的,话说回来产生单独简略的事例,在视觉上从头到尾 在Studio中发现简略的单元测试法使突出。

we的拥有格形式用于经商开采的数据库是SQL Server,总群落400多张讲道台。,超越2000个记忆力停止,每个记忆力停止一般适用胸怀的重大聚会重大聚会。。法典胸怀的每个复杂的效能重大聚会都可以经过写单元测试法来在一定程度上抵押法典优点,记忆力停止亦此中。。法典胸怀的UT硬的是去耦。,它将牵累被拖的法典划分。,充足的击破,拿 … 来说,A重大聚会需求由B重大聚会供给的数据。,当we的拥有格形式测试A重大聚会时,we的拥有格形式只想测试A重大聚会,不愿呼唤给B,这时,we的拥有格形式需求供给由B重大聚会生利的数据。。这叫嘲讽。。

当你做DB单元测试法时,记忆力停止中运用的数据是特别的。,拥有数据都保在数据库表中。,超越2000个记忆力停止增删改查400多个表,we的拥有格形式需求把这些表的数据为每个记忆力停止做减轻,即使测试用例运用的数据彼此胸怀定位,惧怕这会是一团糟。,由于在一般条款下,单元测试法用例的按次是随机的。,即使单元测试法运用的数据是关系的,很有可能两遍运转结出果实亦随机的(除了有一种方式可以紧握case成功按次,我在最终的单独事例中解说。,we的拥有格形式超越20个倒闭的判例是由这事惹起惹起的。,这两台机具的运转结出果实是差别的。,少量的成,少量的倒闭。

注:单元测试法明确,牧座另单独帖子,毒性实验

因而成绩就来了,we的拥有格形式健康状况如何减轻数据?让we的拥有格形式谈谈we的拥有格形式的安排。。

预备数据

we的拥有格形式发现了单独普遍的数据库。,做备用的,叫做,这事版本绝对较低,拿 … 来说,它是,这克制少量的测试的根本数据。。话说回来we的拥有格形式又造成了单独预备使突出。,用于晋级到瞄准放开版本,拿 … 来说,发行版的瞄准版本是。该使突出还测试了晋级停止。。晋级成后,对该数据库停止本地的备用的。好了,数据已预备预先。

应理睬的各自的要点

四大效能

向微软的这事dB UT测试组织,有四大效能需求搞清楚,由于这可能会星力你的测试结出果实

[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
    ...
}
[ClassCleanup]
public static void ClassCleanup()
{
   ...
}
[TestInitialize()]
public void TestInitialize()
{
   ...
}
[TestCleanup()]
public void TestCleanup()
{            
   ...
}
  • 望文生义,ClassInitialize() 在设定初值每个类时让与它。
  • ClassCleanup()这是班的末了,换句话说,当拥有典型的单独类成功时,它被让与。
  • TestInitialize() 每回手术前都叫它。。
  • TestCleanup() 每回让与后都让与它。。

对吗?这不是好的的句子,那个的是好的的。

测试用例的运转是骚乱的,克制多类的事例。

看一眼上面的测试用例的条款,你就会自明的。:

AssemblyInitialize
TestClass1: ClassInitialize
TestClass1: TestInitialize
TestClass1: MyTestCase1
TestClass1: TestCleanup
TestClass2: ClassInitialize
TestClass2: TestInitialize
TestClass2: MyTestCase2
TestClass2: TestCleanup
TestClass1: ClassCleanup
TestClass2: ClassCleanup
AssemblyCleanup

ClassCleanup() 这否决票预示TestClass1ClassCleanup 在运转该类的最终的单独事例晚年的,毫不迟疑让与它。!竟,它将准备妥拥非常窥测被到期。,同TestClass2ClassCleanup 工夫的长短成功。

由于特别惹起看冠词,How to run ClassCleanup (MSTest) after each class with test?

三行为

或许看上面的单独事例:

[实验方式]
public void Test_GetBasicRevenueByName()
{
    SqlDatabaseTestActions testActions = this.SqlTest1Data;
    // Execute the pre-test script
    // 
    (( != 空), "Executing pre-test script...");
    SqlExecutionResult[] pre测试结出果实 = (this.PrivilegedContext, this.PrivilegedContext, );
    // Execute the test script
    // 
    (( != 空), "Executing test script...");
    SqlExecutionResult[] 测试结出果实 = (this.ExecutionContext, this.PrivilegedContext, );
    // Execute the post-test script
    // 
    (( != 空), "Executing post-test script...");
    SqlExecutionResult[] post测试结出果实 = (this.PrivilegedContext, this.PrivilegedContext, );
}

每个测试用例中有三个举措,这三行为的使用权列举如下:

  • 测试前做预备工作,在假定的停止中,您可以拔出或更新的信息每个所需的数据。。
  • TestActudio测试让与记忆力停止,将实践结出果实与凝视结出果实停止相比。
  • 测试后整理是什么?,这时,we的拥有格形式可以回滚PretestAction中拔出或更新的信息的数据。,回复初始围绕

最终的的争吵测试供给了一种减轻数据的方式。,同一的回复初始围绕的意义是成功单独case以前和晚年的数据库胸怀的数据完整同样的。

这时有个成绩,PretestAction胸怀的数据拔出相比好。,即使取代和更新的信息,则需求记载已取代和更新的信息的DAT。。太使烦恼了。即使你的体系十足好,或许不需求运转UT的工夫,你可以用那个的方式:restore DB。后面缺乏说吗,数据库晋级后,we的拥有格形式停止了备用的,we的拥有格形式在这时运用它。。回复B在哪里成功?,在TestCleanup() 中停止。

[TestInitialize()]
public void TestCleanup()
{
   restoreDB();
}

总结

详细停止成功,总结一下:

预备数据库

运转测试用例流

数据洗涤的两种方式

  • 在预测试中添加数据回复句子;
  • TestCleanup()胸怀回复 DB。

事例

话说回来we的拥有格形式将用VS2013从开端到完毕停止演示 + SQL Server 2012是健康状况如何做数据库UT。

发现单独简略的数据库DBUTDemo

create table EmployeeBasicInfo(
   EmployeeNo int NOT NULL primary key,
   Name nVARCHAR(50) NOT NULL,
   TelephoneNum VARCHAR(50) NOT NULL  
);

create table EmployeeRevenue(
   EmployeeNo int NOT NULL primary key,
   BasicRevenue int NOT NULL,
   MealSubsidy int NULL,
   Bonus int NULL,
   foreign key(EmployeeNo) references EmployeeBasicInfo(EmployeeNo)  
);
create procedure GetBasicRevenueByName(@name nVARCHAR(50))  
as
begin
    select bi.Name,r.BasicRevenue from EmployeeRevenue r join EmployeeBasicInfo bi on r.EmployeeNo = bi.EmployeeNo where bi.Name = @name
end

发现UT使突出

  • 选择Unit Test Project,输出工程著名的,选择发现路,点击OK

添加类

输出Server name,选择we的拥有格形式只发现的数据库DBUTDemo,点击Test Connection。即使成出现对话框。陆续点击两遍OK。数据库有效地利用成功。

发现三行为s

点击Click here to create发现测试买卖,点击后,we的拥有格形式找到了单独RESX公文。

输出上面的测试法典:

declare @return_value  int,
        @name  nVARCHAR(50)

EXEC    @return_value = [dbo].[GetBasicRevenueByName]
        @name = N3 张

SELECT  汇成 等于观 = @return_value

接下来,发现那个两个举措:

分开输出以下法典:

insert into EmployeeBasicInfo 等于(1),三 张,    ''16625344257'')
insert into EmployeeBasicInfo 等于(2),四 李氏,   ''16625344258'')
insert into EmployeeBasicInfo 等于(3),西蒙, ''16625344259'')
insert into EmployeeBasicInfo 等于(4),杰克,  ''16625344250'')

insert into EmployeeRevenue 等于(1)    ,30000  ,500    ,20000)
insert into EmployeeRevenue 等于(2)    ,28000  ,500    ,19000)
insert into EmployeeRevenue 等于(3)    ,27000  ,500    ,10000)
insert into EmployeeRevenue 等于(4)    ,26000  ,500    ,20000)
delete from EmployeeRevenue
delete from EmployeeBasicInfo

在末了添加测试必要条件


we的拥有格形式添加了两个测试必要条件,可以在属性啮合中修正值。:
第单独测试必要条件在汇成结出果实集1中。,第同类秒的预期值为30000。,那是三 张的根本工资是30000。。

秒测试必要条件测试结出果实集1非空。

汇编,运转

汇编成后,翻开Test Explorer,运转we的拥有格形式只发现的判例,测试经过。

Ordered Test

最终的说下数据库测试用例即使需求紧握的按次该怎么办,微软供给了一种称为整理的测试用例典型。 Test:

这事判例是各自的判例的集中。,您可以选择需求运转的普通条款。,本身定单。由于定单是紧握的,在这些条款下运用的数据是控制的。,因而在单独整理 有些条款下可以一齐运用少量的数据。,we的拥有格形式可以将数据减轻的单位由未婚男子case变为各自的case甚至单独类胸怀的拥有cases。

发表评论

电子邮件地址不会被公开。 必填项已用*标注