主题:[原创]C# 单元测试心得
C# 单元测试心得
1. 这里讨论的单元指一个类,测试的内容为类中的方法。
比如:我们有下面这个类
namespace SimpleMath
{
class Caculator
{
public Caculator
{
}
// add
public int Add(int a, int b,ref bool res)
{
int c=0;
try
{
checked(c=a+b);
res = true;
}
catch
{
res = false;
}
return c;
}
//division
private float Div(float a, float b,ref bool res)
{
float c=0.0SF;
try
{
checked(c=a/b);
res = true;
}
catch
{
res = false;
}
return c;
}
}
}
目的:测试Caculator类是否正常,其实就是测试类中的两个方法是否正常。
这个例子只是为了说明测试方法。
首先看看怎么测试公有的Div方法。
一. 在名字空间SimpleMath中添加一个测试类。(我们用Nunit工具测试)
[TestFixture]
class TestDiv
{
[Test]
public void TestCase1()
{
Caculator C = new Caculator();
bool result = false;
C.Div(100,0,ref result);
Assert.Isfalse(result);
}
}
优点:操作很方便,代码简洁。
缺点:对大型项目,发布的时候要删除测试类(开发和测试混合在同一个项目中)。
二. 添加一个测试项目。引用要测试的类的dll 文件。
优点:测试项目和开发项目分开,便于管理。
缺点:有些类没有生成为dll文件,比如表示层的类。这样就不能测试那些类。
因此两种方法各有所长,可以根据情况综合应用。
两种方法都没有解决一个问题:怎么测试类中的私有方法?
虽然这种情况并不多见,因为类中的方法不向外公开就没什么意思了,私有的方法只能被类中的其他方法访问,我们测试调用该私有方法的公有方法就行了,一般情况确实如此。如果我们一定要测试私有方法呢?有些时候的确需要测试。
解决此问题的关键就是:反射
比如有这样一个类:
class Sample
{
private int TT(int p)
{
return p;
}
}
测试
:
using pp;
Assembly A = Assembly.LoadFrom("E:\\CSProg\\pp\\bin\\Debug\\pp.dll");
Type T = typeof(Sample);
MethodInfo f = T.GetMethod("TT",BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.InvokeMethod);
Sample S = new Sample();
int b = (int)(f2.Invoke(S,new object[]{(int)9}) );
通过反射获取私有方法,就能测试私有方法了。
问题:私有方法中的ref 参数怎么传递进去呢? 这个问题我还没解决,有解决办法请共享,不胜感激!
yuzhigang84@gmail.com
1. 这里讨论的单元指一个类,测试的内容为类中的方法。
比如:我们有下面这个类
namespace SimpleMath
{
class Caculator
{
public Caculator
{
}
// add
public int Add(int a, int b,ref bool res)
{
int c=0;
try
{
checked(c=a+b);
res = true;
}
catch
{
res = false;
}
return c;
}
//division
private float Div(float a, float b,ref bool res)
{
float c=0.0SF;
try
{
checked(c=a/b);
res = true;
}
catch
{
res = false;
}
return c;
}
}
}
目的:测试Caculator类是否正常,其实就是测试类中的两个方法是否正常。
这个例子只是为了说明测试方法。
首先看看怎么测试公有的Div方法。
一. 在名字空间SimpleMath中添加一个测试类。(我们用Nunit工具测试)
[TestFixture]
class TestDiv
{
[Test]
public void TestCase1()
{
Caculator C = new Caculator();
bool result = false;
C.Div(100,0,ref result);
Assert.Isfalse(result);
}
}
优点:操作很方便,代码简洁。
缺点:对大型项目,发布的时候要删除测试类(开发和测试混合在同一个项目中)。
二. 添加一个测试项目。引用要测试的类的dll 文件。
优点:测试项目和开发项目分开,便于管理。
缺点:有些类没有生成为dll文件,比如表示层的类。这样就不能测试那些类。
因此两种方法各有所长,可以根据情况综合应用。
两种方法都没有解决一个问题:怎么测试类中的私有方法?
虽然这种情况并不多见,因为类中的方法不向外公开就没什么意思了,私有的方法只能被类中的其他方法访问,我们测试调用该私有方法的公有方法就行了,一般情况确实如此。如果我们一定要测试私有方法呢?有些时候的确需要测试。
解决此问题的关键就是:反射
比如有这样一个类:
class Sample
{
private int TT(int p)
{
return p;
}
}
测试
:
using pp;
Assembly A = Assembly.LoadFrom("E:\\CSProg\\pp\\bin\\Debug\\pp.dll");
Type T = typeof(Sample);
MethodInfo f = T.GetMethod("TT",BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.InvokeMethod);
Sample S = new Sample();
int b = (int)(f2.Invoke(S,new object[]{(int)9}) );
通过反射获取私有方法,就能测试私有方法了。
问题:私有方法中的ref 参数怎么传递进去呢? 这个问题我还没解决,有解决办法请共享,不胜感激!
yuzhigang84@gmail.com