用Visual Studio Team版进行测试驱动开发
四、使用VSTET实现单元测试
在设计单元测试时,将应用程序中的单元测试工程分为不同的层次是一个好的方法。下面将要讨论实现数据访问层的内容,而我们现在要做的就是建立一个程序,并测试它。下面的例子建立一个单元测试来测试这个数据访问层。
首先,建立一个新的工程,并命名为”WebTestDAL.UnitTests”。当我们做完后,VSTET在UnitTest.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]属性的方法中删除这条记录。
0
相关文章