上面中命名空间ftmark是被测试的项目命名空间,pclion.UnitTest是本单元测试框架的命名空间,pclion.IDB是本人的一个通用数据库访问接口。
接下来,在Web项目上创建新目录test,在目录test中添加新项-WEB窗体,创建一个名叫dbintfTest的asp.net网页,在网页的<div>中放置一个Literal控件,在代码Page_Load()编写如下代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using pclion.IDB; using ftmark; using dbintfTest; using pclion.UnitTest; public partial class test_dbintfTest : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { DBIntfTest test = new DBIntfTest(); Assert.Init(); try { Literal1.Text += Assert.RunTestHtml("login", test.LoginTest); Literal1.Text += "<br>" + Assert.RunTestHtml("UserGroup",test.UserGroupTest); } finally { Literal1.Text += "<br>" + Assert.RunTestHtml("LogoutTest", test.LogoutTest); } Literal1.Text += "<br>" + Assert.EndofAll(); } } |
最后,右击该页-在浏览器中查看,就可运行该测试,并在浏览器上看到测试结果。
上例中“LogoutTest"测试放在try-finally块中,是因为这个网站系统的登录方式是禁止一个账号多次登录的,只在有登录账号退出后才允许再次登录,所以每个Login测试都必须确保运行一个Logout。
测试框架的代码如下:
using System; using System.Collections.Generic; using System.Web; namespace pclion.UnitTest { public class Assert { public static string name; public static string msg; private static bool success; private static int total; private static int passed; public delegate void TestFunc(); #region 自定义测试框架基础代码 public static void Init() { total = 0; passed = 0; } private static void BeginTest(string _name) { name = _name; success = true; msg = string.Empty; } private static string EndTest() { total++; if (success) passed++; string s = string.Format("[{0}][{1}] - ", total, name); if (success) s += "ok"; else s += "Failure: " + msg; return s; } public static string EndofAll() { string s; if (total == passed) s = "all testes passed."; else s = string.Format("[{0}] testes failure.", total - passed); return s; } /// <summary> /// 运行一个测试 /// </summary> /// <param name="name">测试的显示名称</param> /// <param name="func">测试的函数委托</param> /// <returns>测试的输出</returns> public static string RunTest(string name, TestFunc func) { string s; BeginTest(name); try { func(); } catch (Exception err) { success = false; msg = err.Message + "\n" + err.StackTrace; } s = EndTest(); return s; } /// <summary> /// RunTest的HTML版本 /// </summary> /// <param name="name"></param> /// <param name="func"></param> /// <returns>测试的输出的HTML编码</returns> public static string RunTestHtml(string name, TestFunc func) { return System.Web.HttpUtility.HtmlEncode(RunTest(name, func)); } #endregion public static void AreEqual(bool expected) { success = success && expected; } public static void AreEqual<T>(T expected, T actual) { success = success && expected.Equals(actual); } } } |