享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
posts - 213, comments - 2315, trackbacks - 162, articles - 45
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何测试私有方法?(TDD)

Posted on 2005-02-26 12:13  idior  阅读(...)  评论(... 编辑 收藏
在.net 1.1下一个比较好的方法是(经寒枫提示)
using System;

namespace idior
{
    
public class Tested
    
{
       
#if (DEBUG)
        
public
#else 
        
private 
#endif
            
string PrivateMethod(string str)
        
{
             
//do something
             return str;
        }

    }

}
在.net 2.0下又多了一种方法 partial class
原来的类不变
namespace idior
{
    
public partial class Tested
    
{
        
private string PrivateMethod(string str)
        
{
            
//Do something
            return str;
        }

    }

}
再为测试写一个class
namespace idior
{
    [TestFixture]
    
public partial class Tested
    
{
        Tested tested;
        [SetUp]
        
public void Setup()
        
{
            tested 
= new Tested();
        }

        [Test]
        
public void TestPrivateMethod()
        
{
            Assert.AreEqual(tested.PrivateMethod(
"hello"), "hello");
        }


    }

}

这两种方法各有优缺点
1  优点:源文件不用引入nunit.framework.dll
    缺点:有一定危险,因为当该类被其他类使用的时候,会把这个私有方法当成public
2. 优点:没有危险
    缺点:会引入nunit.framework.dll当然你可以把它放到其他文件夹,发布时删除不过麻烦.

还有一个方法就是使用反射,你又会使用哪种?

方法三:
为要测试的类添加一个继承的子类.在子类中实现Get方法实现对私有成员的访问.如果在Java中还可以将这个
子类设为Test中的Inner Class.
优点: 比反射安全,比前面的方法简单.
缺点: private 变量要变成protected

体会:
XUnit只是通过验证interface.主要思想对某个方法的输入验证它的输出.这种黑盒的测试工具能很大程度上保证
代码的安全,并能驱动开发.但是对于方法的执行过程缺少控制,可能需要更加细致的测试工具来实现对方法的
执行过程的测试(这里仍然指得是程序员测试)虽然这种情况不是非常多.AOP或许能为实现这种测试作出贡献.