技术开发 频道

用Visual Studio Team版进行测试驱动开发



【IT168 专稿】

    自由地编写代码,或是不按着标准来写程序可能会更快地完成一个系统,但是这样的系统也会经常给我们带来恶梦。那么这个问题的解决方案就是就是进行适当的代码测试来引导我们的代码走向正轨。测试驱动开发(TDD)将会通过预定义的测试规则简化开发和减少程序中的bug。最初,进行TDD是十分困难的,但当这种技术获得团队的认可的同时,也获得了很多开发工具的支持。在本文中我们将学习如何使用Visual Studio Team版本来进行测试和实现单元测试和web测试。


一、介绍

   
我们可以从MSDN中学习到更多的关于TDD的知识,但如果用一句话来描述TDD,它就是从测试中驱动开发。因此,我们需要首先在写正式的代码之前要写测试代码,然后使用这些测试来确保我们的代码满足需求。例如,假设我们想写一个计算阶乘的方法。首先,我们需要写一个测试确定从方法中返回的值是不是正确。如下面的测试代码如示:
public void TestFactorial() { int expected = 6; int actual = MyClass.CalculateFactorial(3); Assert.AreEqual(expected, actual, "Factorial is Invalid"); expected = 1; actual = MyClass.CalculateFactorial(0); Assert.AreEqual(expected, actual, "Factorial is Invalid"); }


    Assert是一个静态类,在Microsoft.VisualStudio.TestTools.UnitTesting命名空间中可以找到它。我们可以使用Assert.AreEqual方法来测试两个值是否相等。当这两个值不等时,返回false。下面的计算阶乘的代码:

class MyClass { public static int CalculateFactorial(int Number) { if (Number < 0) return -1; // -1 = undefined if (Number <= 1) return 1; int fact = 1; for (int i = 0; i < Number; i++) { fact = fact * (Number - i); } return fact; } }



 现在我们已经有了对TDD的基本理解,下面我们可以来探索VSTETTDD中的使用。在VSTET中为我们提供了用于测试的每一样东西。在VSTET中允许我们建立、编辑和运行测试。我们甚至可以存储测试结果。

二、VSTE支持的测试类型

VSTET支持如下测试类型:
    单元测试:正如名子所示,这个测试类型的目标是测试我们的单元代码。VSTET集成了用于单元测试的框架:Microsoft.VisualStudio.QualityTools.UnitTestFramework,这个框架包括了各种命用于编写、执行、报告单元测试的名空间、类以及接口。
    Web测试:这个测试类型可以让我们记录Web应用程序页面之间的交互和导航动作。我们可以多次使用这些动作序列来测试我们的应用程序。
人工测试:这是最简单的测试类型。我们需要在确定预处理条件、提交条件和程序中所需要的结果之后运行应用程序,并运行测试用例。
负载测试::我们可以使用负载测试来运行单元测试或Web测试,来测试它们的性能指数。

顺序测试:这个测试类型由一系列按指定顺序排列的测试组成。要注意的是我们不能将负载测试包括在里面。
   
普通测试:这种测试类型可以让我们使用第三方的测试工具。例如,我们可以从其他测试源或在VSTET中可运行的测试导入到VSTET中。在我们包装了我们已经存在的测试、可执行的测试或第三方的工具后,VSTET就会象对待自己的测试一样对待它们。



三、测试解决方案

   
为了学习如何在VSTET中使用不同的测试类型来工具,本文使用了一个可下载的网站的例子,这个例子要求用户注册和登录。我们可以看看如图1的结构和组件。


图1 WebTest解决方案:在sample解决方案中的这个工程包括了一个简单的网站,一个数据访问层,以及其他的一些测试工程。

    Example解决方案由如下六个工程组成:
1. WebTest:这个工程包含了Web站点的UI元素,其中包括登录页和一个欢迎页。
2. WebTest.BizObjects:这个工程包含了要求的商业对象。User.cs包含了所定义的用户对象。
3. WebTest.DAL:这是一个数据访问层。UserDAL类包含了被User类支持的不同的方法实现。
4. WebTestDAL.Interfaces:这个工程包含了所用的接口。IUserDAL定义了被User类支持的操作列表。
5. WebTest.DAL.UnitTests:这个工程包含了用于测试WebTest.DAL的单元测试。
6. WebTest.WebTest:这个工程包含了用于测试WebTest工程的UI部分的Web测试程序。


四、使用VSTET实现单元测试
在设计单元测试时,将应用程序中的单元测试工程分为不同的层次是一个好的方法。下面将要讨论实现数据访问层的内容,而我们现在要做的就是建立一个程序,并测试它。下面的例子建立一个单元测试来测试这个数据访问层。
首先,建立一个新的工程,并命名为”WebTestDAL.UnitTests”。当我们做完后,VSTETUnitTest.cs中自动建立一个叫UnitTest1的测试类,我们可以使用这个类来测试数据访问层。重新命名UnitTest.cs后。输入如下的代码:

[TestClass] public class UserDALTests { public UserDALTests() { // // TODO: Add constructor logic here // } private const string Email = "test@test.com"; [ClassInitialize()] public static void SetUpTestUser(TestContext testContext) { try { User user = new User(); user.Name = "Test"; user.Password="test@1"; user.Email = Email; UserDAL userDAL = new UserDAL(); userDAL.CreateUser(user); } catch (Exception ex) { Assert.Fail(ex.Message); } } [TestMethod] public void TestCreateUser() { try { User user = new User(); user.Name = "Test"; user.Password = "test@1"; user.Email = Email; UserDAL userDAL = new UserDAL(); userDAL.CreateUser(user); user = userDAL.GetUser(Email); Assert.AreEqual("Test", user.Name); Assert.AreEqual("test@1", user.Password); Assert.AreEqual(Email , user.Email); } catch (Exception ex) { Assert.Fail(ex.Message); } } [TestMethod] public void TestGetUser() { try { UserDAL userDAL = new UserDAL(); User user = userDAL.GetUser(Email); Assert.IsNotNull(user); Assert.AreEqual(Email, user.Email); } catch (Exception ex) { Assert.Fail(ex.Message); } } [TestMethod] public void TestGetUsers() { try { UserDAL userDAL = new UserDAL(); List<User> users = userDAL.GetUsers("(Email LIKE '%Test%')"); Assert.IsTrue(users.Count > 0); foreach (User user in users) { Assert.IsTrue(user.Email != null && user.Email != ""); } } catch (Exception ex) { Assert.Fail(ex.Message); } } [TestMethod] public void TestUpdateUser() { try { UserDAL userDAL = new UserDAL(); User user = userDAL.GetUser(Email); user.Name = "Update"; user.Password = "Update"; userDAL.UpdateUser(user); user = userDAL.GetUser(Email); Assert.IsNotNull(user); Assert.AreEqual(Email, user.Email); Assert.AreEqual("Update", user.Password); Assert.AreEqual("Update", user.Name); } catch (Exception ex) { Assert.Fail(ex.Message); } } [TestMethod] public void TestDeleteUser() { try { UserDAL userDAL = new UserDAL(); userDAL.DeleteUser(Email); User user = userDAL.GetUser(Email); Assert.IsNull(user); } catch (Exception ex) { Assert.Fail(ex.Message); } } [ClassCleanup] public static void ClearTestUser(TestContext testContext) { try { UserDAL userDAL = new UserDAL(); userDAL.DeleteUser(Email); } catch (Exception ex) { Assert.Fail(ex.Message); } } } }

要注意的是UserDALTests类使用了一个TestClass属性,这就暗示它是一个用于测试其他类的类。UserDALTests类使用了一个email常量字符串来标识一个测试用户操作的特殊用户。
   private const string Email = "test@test.com";
 
下面的SetUpTestUser()方法建立了一个在所有的单元测试类方法中使用的用户记录。
[ClassInitialize()] public static void SetUpTestUser(TestContext testContext) { try { User user = new User(); user.Name = "Test"; user.Password="test@1"; user.Email = Email; UserDAL userDAL = new UserDAL(); userDAL.CreateUser(user); } catch (Exception ex) { Assert.Fail(ex.Message); } }



要注意的是SetUpTestUser方法含有一个ClassInitialize属性,这个属性确保在方法中的代码在执行类的第一个测试运行之前就执行它。
在UserDALTests中的其他方法都非常容易理解,在这里就不做额外说明了。但需要简单地说一句,在UserDALTests类中的每一个测试方法都测试一个和UserDAL类类似的方法名。如,TestCreateimya CreateUser方法,TestGetUser测试GetIser方法,以及TestGetUsers、TestUpdateUser和TestDeleteUser分别测试GetUsers、UpdateUser和DeleteUser方法。最后,ClearTestUser方法删除了被SetUpTestUser建立的用户纪录。要注意的是这个方法被设为ClassCleanup属性,这就确保了这个方法在其他测试执行前执行。


   
当我们手工设计自己的单元测试类时,初始化和清楚单元测试所需要的资源是非常容易的。例如,如果我们正在写数据库操作的单元测试,我们可以在被标识[ClassInitialize]属性的方法中建立一个模拟记录。并在类方法中来测试数据库操作,然后在标识为[ClassCleanup]属性的方法中删除这条记录。



五、建立Web测试

    一个Web应用程序是由请求、交互和响应混合而成的应用。因此,为了更好的测试它,我们需要模拟请求、交互和响应的动作。Web Tests允许我们记录请求、用户交互和在页面之彰的导航。可记录的,能重现的Web测试可以节省我们很多的时间。
    假设我们有以下测试用例:
 
摘要:测试用户登录
   分步来执行测试:
   1. 导航到http://webtest/default.aspx
   2. 输入用户名和密码
   3. 单击登录按钮
   所期望的执行结果:
显示网页http://webtest/home.aspx,并看到欢迎信息。
 
    下面是为记录Web测试的步骤:
 
1. 建立一个新的测试工程,并命名为WebTest.WebTests。
2. 单击鼠标右键、并选择“Add a New Test“选择。
3. 按Next,选择Web测试选项。
4. 命名测试为UC1 _TestLogin.webtest


    当我们完成上面的步骤后,VSTET就会在IE中建立一个窗口。这时我们在IE中输入想记录的Web的URL,在本文中是http://localhost/Webtest.并输入用户名和密码,最后单击Login按钮,然后关闭窗口。
为了运行Web我们刚建立的Web测试,打开这个测试,并单击运行按钮,如图2所示:



 
图2 执行一个Web测试
 
    在Web测试执行后,将向服务端发送我们曾经记录的每一个请求。这个测试将自动记录每一次请求响应所花的时间。以及响应信息的大小。这个过程可以使用不同的协议,并可传递任意参数。

    Web测试的结果如图3所示。这个测试结果包含了三个HTTP响应。图3的响应信息面板显示了这些内容。如状态、响应时间和每一个请求的大小。


3 Web工程测试结果
0
相关文章