新足迹

 找回密码
 注册

精华好帖回顾

· 王思涵小同学的Crown赌场之旅(外传) (2007-5-13) poloand · PB的动物世界---第四辑:SYD Widelife游记(58楼) (2008-11-7) Pluggedboy
· 追悼一只曾叫BABY的三脚猫 (2009-6-15) suel · 决战SURREY HILLS之巅! 完整版 (2007-10-27) lss123
Advertisement
Advertisement
查看: 1215|回复: 18

[IT] Unit Test this! [复制链接]

2010年度奖章获得者

发表于 2010-4-6 13:10 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
to test a very simple method always make me uncertain 'what to test' all the time!

I'd like to know what would you test for method like this one?

public DataSet GetLinksByAnalysisId(int analysisId, IDataAccess _dataAccess)
{
        var result = _dataAccess.SelectAnalysisLinksOverviewByAnalysisId(analysisId);
        return result;
}

[ 本帖最后由 dalaohu 于 2010-4-6 14:33 编辑 ]
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-4-6 13:17 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
start off with my humble one!

[TestMethod]
public void GetLinksById_Should_Return_Links()
{
      var _dataAccess = MockRepository.GenerateMock<IDataAccess>();
      _dataAccess.Expect(x => x.SelectAnalysisLinksOverviewByAnalysisId(0));
      analysisBusinessLogic.GetLinksByAnalysisId(0, _dataAccess);
      _dataAccess.VerifyAllExpectations();
}
===========================================================================

For people that into tests, can you tell me am I testing the right thing? or how would you test it?

[ 本帖最后由 dalaohu 于 2010-4-6 18:01 编辑 ]
头像被屏蔽

禁止访问

发表于 2010-4-6 13:25 |显示全部楼层
此文章由 wtf 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wtf 所有!转贴必须注明作者、出处和本声明,并保持内容完整
lz 不停的发一些具体的技术贴,让我灰常感动。。

发表于 2010-4-6 13:26 |显示全部楼层
此文章由 atm 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 atm 所有!转贴必须注明作者、出处和本声明,并保持内容完整
同感动

2010年度奖章获得者

发表于 2010-4-6 13:27 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
haha in a good way or bad?
头像被屏蔽

禁止访问

发表于 2010-4-6 13:32 |显示全部楼层
此文章由 wtf 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wtf 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-4-6 12:27 发表
haha in a good way or bad?

好啊。不过嫩不妨贴点java的东西讨论讨论?
签名被屏蔽
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-4-6 13:35 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wtf 于 2010-4-6 12:32 发表

好啊。不过嫩不妨贴点java的东西讨论讨论?


I try to keep my post as generic as possible. the concept apply exactly same to all OO languages if you using mocks.

发表于 2010-4-6 14:06 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
I don't think the method GetLinksByAnalysisId need be tested. It could be replaced directly by two sentences below:

DateTime dateExecuted;
result = _dataAccess.SelectAnalysisLinksOverviewByAnalysisId(settings.UserName, analysisId, out dateExecuted);

And you don't even care about the out dateExecuted value.

发表于 2010-4-6 14:20 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
就算 GetLinksByAnalysisId 里有其它逻辑代码跟 dateExecuted 和 result 有关,对 GetLinksByAnalysisId 的测试我认为也不需要mock 一个dataAccess了。因为所有测试都应该focus在result上,应该直接mock result 对象,以及做充分的白盒测试。

当然前提是_dataAccess.SelectAnalysisLinksOverviewByAnalysisId方法有它自己的单元测试,它也应该有自己的单元测试。

2010年度奖章获得者

发表于 2010-4-6 14:22 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Let's say it has to be tested for the sake of code coverage.
What would you test?

2010年度奖章获得者

发表于 2010-4-6 14:27 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 中间人 于 2010-4-6 13:20 发表
就算 GetLinksByAnalysisId 里有其它逻辑代码跟 dateExecuted 和 result 有关,对 GetLinksByAnalysisId 的测试我认为也不需要mock 一个dataAccess了。因为所有测试都应该focus在result上,应该直接mock result 对象 ...

Mock result? You got me confused.  More details pls. Maybe some demo code?
Advertisement
Advertisement

发表于 2010-4-6 14:30 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-4-6 13:22 发表
Let's say it has to be tested for the sake of code coverage.
What would you test?


I will, if I can, overload _dataAccess.SelectAnalysisLinksOverviewByAnalysisId to take only two params (username, id) and replace the method GetLinksByAnalysisId(...) as _dataAccess.SelectAnalysisLinksOverviewByAnalysisId(settings.UserName, analysisId). So no test needed at all.

If I cannot replace it, I will write Assess.IsTrue(true);

发表于 2010-4-6 14:36 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Mock result? You got me confused.  More details pls. Maybe some demo code?


不好意思,我的意思是,如果 GetLinksByAnalysisId 里有其它针对 result 的代码,比如validation等等,那么直接实例化或者mock相应的 result 对象就可以了。这样便于做white box 测试。

比如
Result result = new Result { Name = 'zhong', Text = 'haha' };
//code to test the new result object;

result = new Result { Name = 'jian', Text = 'xixi' };
//code to test the new result object;

发表于 2010-4-6 14:41 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
多说一点,这段代码有点像Adapter,可能和Proxy混用的,如果是这样的话,需要测试实例中的 _dataAccess 是否为空

发表于 2010-4-6 14:42 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
没研究过Unit Test, 看不太懂, 尽量崇拜下高人.

2010年度奖章获得者

发表于 2010-4-6 15:04 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Business Logic Layer:
DataSet GetLinksByAnalysisId(Settings settings, int analysisId)

DataAccess Layer:
IDataAccess _dataAccess
------------------------------------------------------------------

IDataAccess has to be mockup cause I'm testing GetLinksByAnalysisId() in the Business Logic layer

the Result if from this mocked dataAccess - dont' think there's anyting to test

I can set a mocked returned value for result.
_dataAccess.Expect(x => x.SelectAnalysisLinksOverviewByAnalysisId(_settings.UserName, 0, out dateExecuted)).Return(whateverdatareturned)


All I can think of to test is to make sure the dataAccess method SelectAnalysisLinksOverviewByAnalysisId() get called.
Advertisement
Advertisement

发表于 2010-4-6 15:18 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不要为了test而test

2010年度奖章获得者

发表于 2010-4-6 15:23 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2010-4-6 14:18 发表
不要为了test而test


yea I like this theory alot, but it's out-of-scope in this discussion :)
in TDD it's the only way to go

[ 本帖最后由 dalaohu 于 2010-4-6 17:36 编辑 ]

2010年度奖章获得者

发表于 2010-4-7 16:48 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
thought I might share with you guys. my initial test wasn't too far from being perfect :)

to make it a full cycle here's the test I'm happy with.

[TestMethod]
public void Test()
{
   var id = 1;
   var expectedResult = new DataSet();

   var dataAccess = MockRepository.GenerateMock<IDataAccess>();
   dataAccess.Expect(x => x.SelectAnalysisLinksOverviewByAnalysisId(1)).Return(expectedResult);

   var analysisBusinessLogic = new AnalysisLinksBusinessLogic(dataAccess);
   var result = analysisBusinessLogic.GetLinksByAnalysisId(id);
   Assert.AreEqual(expectedResult, result);
   dataAccess.VerifyAllExpectations();

}

[ 本帖最后由 dalaohu 于 2010-4-7 19:47 编辑 ]

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部