当前位置:  开发笔记 > 编程语言 > 正文

如何对复杂方法进行单元测试

如何解决《如何对复杂方法进行单元测试》经验,为你挑选了3个好方法。

我有一种方法,给定北角和轴承角度,从8个可能的值(北,东北,东等)返回罗盘点值.我想创建一个单元测试,为这个方法提供合适的覆盖,为North和Bearing提供不同的值,以确保我有足够的覆盖率让我对我的方法有效.

我的原始尝试为-360到360生成了North的所有可能的整数值,并测试了每个Bearing值从-360到360.但是,我的测试代码最终成为我正在测试的代码的另一个实现.这让我想知道最好的测试是什么,这样我的测试代码不仅会包含与我的生产代码相同的错误.

我目前的解决方案是花时间编写一个包含数据点和预期结果的XML文件,我可以在测试期间阅读并使用它来验证方法,但这似乎非常耗时.我不想写一个包含与原始测试包含的相同值范围的文件(这将是很多XML),但我确实想要包含足够的内容以充分测试该方法.

如何在不重新实现方法的情况下测试方法?

如何获得足够的覆盖率,以便对我正在测试的方法有信心,而无需为所有可能的输入和结果提供测试点?

显然,不要过多地关注我的具体示例,因为这适用于许多需要测试的复杂计算和数据范围的情况.

注意:我使用的是Visual Studio和C#,但我相信这个问题与语言无关.



1> Bill the Liz..:

首先,你是对的,你希望你的测试代码重现与被测代码相同的计算.其次,你的第二种方法是朝着正确方向迈出的一步.您的测试包含一组特定的输入,其中包含这些输入的预先计算的预期输出值.

您的XML文件应该只包含您所描述的输入数据的子集.您的测试应该确保您可以处理输入域的极端范围(-360,360),范围末端的几个数据点以及中间的一些数据点.当给定的值超出输入范围(例如-361和+361)时,您的测试还应检查您的代码是否正常失败.

最后,在您的特定情况下,您可能需要更多边缘情况,以确保您的函数正确处理有效输入范围内的"切换"点.这些将是输入数据中的点,其中输出将从"北"切换到"西北",从"西北"切换到"西"等.(不要运行代码来查找这些点,计算它们用手).

只关注这些边缘情况,边缘之间的一些情况应该会大大减少您必须测试的点数.



2> ConcernedOfT..:

您可以将方法重新分解为更容易进行单元测试的部分,并编写部件的单元测试.然后整个方法的单元测试只需要集中在集成问题上.



3> S.Lott..:

我更喜欢做以下事情.

    创建一个包含正确答案的电子表格.无论多么复杂,它都是无关紧要的.您只需要一些带有案例的列和一些带有预期结果的列.

    对于你的例子,这可能很大.但是大可以.你将有一个角度,一个方位和产生的罗盘点值.你可能有一堆中间结果.

    创建一个小程序,读取电子表格并编写简化的底线unittest案例.你希望你的案件被剥夺

    def testCase215n( self ):
        self.fixture.setCourse( 215 )
        self.fixture.setBearing( 45 )
        self.fixture.calculate()
        self.assertEquals( "N", self.fixture.compass() )
    

[那是Python,同样的想法也适用于C#.]

电子表格包含正确答案的唯一权威列表.您可以从此生成一次或两次代码.当然,除非您在电子表格版本中发现错误并且必须解决此问题.

我使用一个小的Python程序与xlrd和Mako模板生成器来做到这一点.你可以用C#产品做类似的事情.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有