请问各位 V2 大佬,一些关于单元测试的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ray1888
V2EX    程序员

请问各位 V2 大佬,一些关于单元测试的问题

  •  
  •   ray1888
    ray1888 2018-03-06 23:00:51 +08:00 3155 次点击
    这是一个创建于 2777 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设我想去对一个函数(这个函数是对数据进行转换)进行测试,但是数据的来源是数据库(假设下面的例子),那么我是应该要单独写类似与从数据库读出来出来的数据的测试用例吗? 因为想对类似于这种抽象的情况已有代码进行重构,特地来问一下

    假设代码 def a(): data = MongoClient.find() outdata = Tranlate(data) 
    11 条回复    2018-03-09 17:37:48 +08:00
    ray1888
        1
    ray1888  
    OP
       2018-03-06 23:14:24 +08:00 via Android
    还有一个问题是关于被测试代码的颗粒度问题,有大概的规则或者经验用来划分需要测试的代码的颗粒度
    likuku
        2
    likuku  
       2018-03-06 23:28:02 +08:00
    要是便于测试的话,那么就把连数据库抽数据的部分和数据处理 /运算的部分分离开,后者独立成一个函数,

    这样写单元测试就便于测试它了(单元测试里,可以自己写入测试输入数据 /读配置文件从测试库抽数据测)
    msg7086
        3
    msg7086  
       2018-03-07 02:38:52 +08:00
    可以先考虑下哪些功能要测,哪些功能不用测。
    比如说 .find() ,要写单元测试的话,等于是在测 MongoClient 了,没意义。
    可以只测 Translate 函数。

    当然也可以先插假数据进数据库,然后再测 a()。但是这应该属于集成测试范畴了。
    whalegia
        4
    whalegia  
       2018-03-07 03:40:19 +08:00
    单元测试测逻辑咯。Find 是逻辑吗?不是。不测。
    Translate 是逻辑吗?是。那就测。

    Translate 中是有多种 condition 或者 translate 方法吗?是。那就拆开测各个逻辑。
    kbeznak
        5
    kbeznak  
       2018-03-07 03:46:52 +08:00
    关键词:mock
    wweir
        6
    wweir  
       2018-03-07 04:13:32 +08:00 via Android
    前段时间想通一个事:会到外界产生影响的东西,都该以类似接口、的形式实现
    需要添加单元测试时直接 mock 对应实现
    nullcc
        7
    nullcc  
       2018-03-07 08:22:57 +08:00
    这种情况下你可以写一个 helper 来专门在测试开始前创建 seed data,在某个具体的测试函数中先调用这个 helper,然后写你的测试。
    asj
        8
    asj  
       2018-03-07 08:38:05 +08:00   1
    测你认为可能出错的地方。如果担心的是数据转换,就把 find 结果 mock 出来单测转换。如果担心的各部分之间的集成,就准备好可控的环境,对整段代码测试。
    测试粒度取决于被测的单元,无论这个单元的抽象层级高(比如进行某项业务)还是低(比如格式化一个字符串),测试都应该测目标单元可见的输出。大部分所谓的粒度太细不是测的太细,而是在高层次的测试中描述低层次的细节。比如本意是测试转账业务,但是写出来的代码却在比较格式化后的字符串,必然导致测试难以理解,难以维护。
    lihongjie0209
        9
    lihongjie0209  
       2018-03-07 09:04:04 +08:00   1
    ```
    def getDate():
    return MongoClient.find();

    def a():

    outdata = Tranlate(data)


    a(getData())


    ```

    总结来说你原来的函数违反了单一职责原则, 在一个函数中干了太多的事情:
    它把数据提取和数据转换耦合在一起, 当你需要更换数据源(如测试的使用 mock)就会遇到问题
    v2xe2v
        10
    v2xe2v  
       2018-03-07 13:46:05 +08:00
    mock +1
    ray1888
        11
    ray1888  
    OP
       2018-03-09 17:37:48 +08:00
    @lihongjie0209 能再请问一下吗?如果我现在有个大的方法,里面每个调用的函数都已经写了,单元测试了,那么如果我想单元测试这个大的函数,是应该 Mock 每个单独调用方法的输出?还是直接运行那个被调用的方法
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4364 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is poweredby solitude
    VERSION: 3.9.8.5 23ms UTC 05:33 PVG 13:33 LAX 22:33 JFK 01:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86