单元测试中的问题和解决方案
来源:互联网 发布:淘宝内容运营优化 编辑:程序博客网 时间:2024/06/04 19:56
利用单元测试,我们可以找出很多意想不到的问题,在Nunit对项目进行单元测试 过程中就查找出了很多隐藏的问题,下面是单元测试中遇到的问题与解决方案:
1问题1
下面是项目中的代码:
/// <summary>
/// 根据taskid,获得对应的Part记录
/// </summary>
/// <param name="taskId"></param>
/// <returns></returns>
public WYEng.Model.TQL_Part GetPaperPart(int taskId)
{
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter(PARM_TASKID, SqlDbType.Int);
parm[0].Value = taskId;
WYEng.Model.TQL_Part part = new WYEng.Model.TQL_Part();
using (SqlDataReader rdr = XPWY.DBUtility.DBHelperSQL.ExecuteReader(SQL_SELECT_PART, parm))
{
while (rdr.Read())
{
part.PartCode = rdr.GetString(0);
part.SetCode = rdr.GetString(1);
part.SubjectId = rdr.GetInt32(2);
part.DisplayOrder = rdr.GetInt32(3);
part.Description = rdr.GetString(4);
}
}
return part;
}
/// 根据taskid,获得对应的Part记录
/// </summary>
/// <param name="taskId"></param>
/// <returns></returns>
public WYEng.Model.TQL_Part GetPaperPart(int taskId)
{
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter(PARM_TASKID, SqlDbType.Int);
parm[0].Value = taskId;
WYEng.Model.TQL_Part part = new WYEng.Model.TQL_Part();
using (SqlDataReader rdr = XPWY.DBUtility.DBHelperSQL.ExecuteReader(SQL_SELECT_PART, parm))
{
while (rdr.Read())
{
part.PartCode = rdr.GetString(0);
part.SetCode = rdr.GetString(1);
part.SubjectId = rdr.GetInt32(2);
part.DisplayOrder = rdr.GetInt32(3);
part.Description = rdr.GetString(4);
}
}
return part;
}
写测试用例如下:
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using WYEng.SQLServerDAL;
namespace WYEng.TestUnit
{
[TestFixture]
public class TQL_Part
{
SQLServerDAL.TQL_Part part;
WYEng.Model.TQL_Part p;
[SetUp]
public void CreateObject()
{
part = new WYEng.SQLServerDAL.TQL_Part();
p=new WYEng.Model.TQL_Part();
}
[TearDown]
public void DeleteObject()
{
part = null;
p=null;
}
[Test]
public void GetPaperPart()
{
//输入TaskId的值,然后可以获取其Part所有信息
p = part.GetPaperPart(1); //正常情况
Assert.AreEqual(p.PartCode, "6666");
}
}
}
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using WYEng.SQLServerDAL;
namespace WYEng.TestUnit
{
[TestFixture]
public class TQL_Part
{
SQLServerDAL.TQL_Part part;
WYEng.Model.TQL_Part p;
[SetUp]
public void CreateObject()
{
part = new WYEng.SQLServerDAL.TQL_Part();
p=new WYEng.Model.TQL_Part();
}
[TearDown]
public void DeleteObject()
{
part = null;
p=null;
}
[Test]
public void GetPaperPart()
{
//输入TaskId的值,然后可以获取其Part所有信息
p = part.GetPaperPart(1); //正常情况
Assert.AreEqual(p.PartCode, "6666");
}
}
}
model层中的TQL_PArt的description下的代码段有问题
if (value != null && value.Length > 50)
throw new ArgumentOutOfRangeException("Invalid value for Description", value, value.ToString());
数据库中description的字段为Varchar(500),而这里只为50,现在更正为 if (value != null && value.Length > 50)
修正后,运行后的状态条为绿色。
2问题2
然后GetPaperPart()方法中加入如下代码,测试边界情况:
p = part.GetPaperPart(1000);//边界情况
Assert.AreEqual(p, null);
Assert.AreEqual(p, null);
用以上代码测试边界条件时,状态条为红色。
经检查,发现代码如下
public WYEng.Model.TQL_Part GetPaperPart(int taskId)
{
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter(PARM_TASKID, SqlDbType.Int);
parm[0].Value = taskId;
WYEng.Model.TQL_Part part = new WYEng.Model.TQL_Part();
using (SqlDataReader rdr = XPWY.DBUtility.DBHelperSQL.ExecuteReader(SQL_SELECT_PART, parm))
{
while (rdr.Read())
{
part.PartCode = rdr.GetString(0);
part.SetCode = rdr.GetString(1);
part.SubjectId = rdr.GetInt32(2);
part.DisplayOrder = rdr.GetInt32(3);
part.Description = rdr.GetString(4);
}
}
return part;
}
{
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter(PARM_TASKID, SqlDbType.Int);
parm[0].Value = taskId;
WYEng.Model.TQL_Part part = new WYEng.Model.TQL_Part();
using (SqlDataReader rdr = XPWY.DBUtility.DBHelperSQL.ExecuteReader(SQL_SELECT_PART, parm))
{
while (rdr.Read())
{
part.PartCode = rdr.GetString(0);
part.SetCode = rdr.GetString(1);
part.SubjectId = rdr.GetInt32(2);
part.DisplayOrder = rdr.GetInt32(3);
part.Description = rdr.GetString(4);
}
}
return part;
}
用YEng.Model.TQL_Part part = new WYEng.Model.TQL_Part();实例化一个对象以后,如果rdr里面没有任何行,part的值也不为null,所以修改代码如下:
public WYEng.Model.TQL_Part GetPaperPart(int taskId)
{
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter(PARM_TASKID, SqlDbType.Int);
parm[0].Value = taskId;
WYEng.Model.TQL_Part part = new WYEng.Model.TQL_Part();
using (SqlDataReader rdr = XPWY.DBUtility.DBHelperSQL.ExecuteReader(SQL_SELECT_PART, parm))
{
if (!rdr.HasRows)
{
part = null;
}
else
{
while (rdr.Read())
{
part.PartCode = rdr.GetString(0);
part.SetCode = rdr.GetString(1);
part.SubjectId = rdr.GetInt32(2);
part.DisplayOrder = rdr.GetInt32(3);
part.Description = rdr.GetString(4);
}
}
}
return part;
}
{
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter(PARM_TASKID, SqlDbType.Int);
parm[0].Value = taskId;
WYEng.Model.TQL_Part part = new WYEng.Model.TQL_Part();
using (SqlDataReader rdr = XPWY.DBUtility.DBHelperSQL.ExecuteReader(SQL_SELECT_PART, parm))
{
if (!rdr.HasRows)
{
part = null;
}
else
{
while (rdr.Read())
{
part.PartCode = rdr.GetString(0);
part.SetCode = rdr.GetString(1);
part.SubjectId = rdr.GetInt32(2);
part.DisplayOrder = rdr.GetInt32(3);
part.Description = rdr.GetString(4);
}
}
}
return part;
}
运行Nunit后,状态为绿色,其他的类似问题也进行了相应的修正。
我正在研究Nunit单元测试,有不当的地方希望大家能指正,谢谢。下一篇,我将会讲一下,如何利用Nunit测试异常
- 单元测试中的问题和解决方案
- 单元测试中的问题和解决方案
- 记录 $\LaTeX$ 使用中的问题和解决方案
- Android:AS单元测试可能出现的卡死问题和解决方案
- 关于spring+hibernate中的单元测试问题
- 序列化问题中的向上兼容和向下兼容解决方案。
- 谈谈Javascript中的空格Bug问题和解决方案
- 单元测试遇到的问题和解决办法
- 项目中的问题与解决方案
- SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
- 单元测试的过渡解决方案
- junit单元测试错误解决方案
- Android秒级编译方案-Freeline集成和使用过程中的一些问题和解决方案
- unity3d中的坑和解决方案
- unity3d中的坑和解决方案
- unity3d中的坑和解决方案
- unity3d中的坑和解决方案
- IOCP相关问题和解决方案
- OpenMP与C++:事半功倍地获得多线程的好处(上)
- 在windows XP下如何用Vmware装Linux操作系统
- 使用Ruby脚本操作Oracle数据库
- fjnu 1759 1+1猜想 II
- HTTP请求-头信息
- 单元测试中的问题和解决方案
- VMware安装及基于系统安装手册
- fjnu 1195 Making Change
- 微软MIX’08前线报道——Ray Ozzie阐述微软Web战略
- 主板跳线
- fjnu 1710 保龄球娱乐计分
- 微软MIX’08今日开幕
- struts2中利用拦截器实现权限管理
- ASP身份证号码验证函数