• Kǎfκã²⁰²⁰
    2019-02-04
    可重复特别重要,有些开发在本地测和数据库相关应用时,由于前置依赖数据比较多,为了避免测试前写冗长的数据准备代码,所以会预先在数据库中准备好初始数据。每个测试再初始化特定的数据,因为Spring测试框架可以自动回滚,所以在本地是可以重复跑的。但是,放到CI中时,测试就统统没法过了,因为CI的数据库是共用的,没有本地的那份初始化数据集。一种方式是,保持数据库干净,用测试时用初始化脚本准备数据。如果测的场景比较复杂,比如要测多个事务的交互结果,还可以引入Docker,将依赖的数据库及初始化数据做成Docker的image,测试代码就更加简单,并且可以重复运行了,只要CI支持Docker即可

    作者回复: 很好的分享!

     2
     11
  • 毅
    2019-02-04
    本节课我有以下几点体会:
    1、从开发者的视角看编码和测试是不分家的,是可以通过重构形成良性生态圈的,类似之前课程中的反馈模型和红绿重构模型;
    2、A-TRIP是个很好的总结和行动指南,在今后工作中应一以贯之,把工作做到扎实有成效;
    3、对文中提到的数据库依赖的问题,我也说说自己的浅见。我觉得在测试代码中尽量避免与数据库打交道,测试更关注领域与业务,往往爆雷更多的是resource和service,模型的变化往往牵动着表结构的变化,与其两头兼顾不如多聚焦模型,我常用的做法是用例配合若干小文件(数据忠实于模型),保证库操作临门一脚前所有环节都是正确的,同时方便适应变化。一旦出现异常,也比较容易定位是否是数据库操作引发的问题。
     (此点基于工作中发现项目型程序员大多是先急于把表结构定义出来,好像不这么做写代码就不踏实)
    展开

    作者回复: 很好的总结!

    
     5
  • 陈斯佳
    2019-05-17
    测试的步骤分为前置准备,执行断言和清理,我们要做到a trap,也就是automatic, thorough, repeatable, independent,professional,所以想要学好测试,就要先写简单的测试。
    
     1
  • 钢之镇魂曲
    2019-03-23
    我是游戏服务器开发程序员,我经历过不少公司,但是从来没见过写测试的。不知道是不是游戏有什么特殊性?还是其他的什么问题?

    作者回复: 没有特殊性,不写是一种现象,不是必然。当然,如果你问起,通常会有两类答案,没时间和我特殊。

    
     1
  • 朱国伟
    2019-03-09
    我还是习惯先写代码 在写测试 如 有一个投资机会详情(opportunities/{id})的功能

    首先是大的步骤任务拆解

    - 查询机会基本信息
    - 查询机会参与方(标的方、投资方)信息
    - 相似推荐 即推荐与该机会类似的机会
    - Domain ==> VO

    然后是每个大步骤再细分 如
    - 查询机会基本信息
        - 调用机会Service getById() 获取基本信息
        - 调用机会Mappper getById() 获取基本信息
        - 机会Mapper.xml 写查询sql
        - 机会Mapper单元测试
            - 准备机会数据 setUp/before中
                - 一个有效机会1
                - 一个无效机会2
                - 一个有效机会3

            - 测试getById(1) 能正常查询 并且页面上需要展示的字段都有
            - 测试getById(2) asertNull()

    然后后面就是按部就班的开发了 我是从上往下进行开发的(或者说是从始到终进行开发的) 即先开发Service 再开发Mapper

    开发完一个打个勾
    - - 调用机会Service 获取基本信息 ✅

    Mapper这一层的测试 直接连到是一个测试库 回滚依赖的是Spring自带的回滚机制

    假设实际代码中只需查询 无需插入 那么会专门在该测试类中新建一个额外的Mapper 用于插入测试数据
    如
    class FooMapperTest {
        @Before
        public void setUp(){
            testMapper.insert(1, 1, "name1");
        }
        
        interface FooTestMapper{
            @Insert("...")
            void insert(int isvalid, int id, String name, ...)
        }
    }

    service controller级别的测试 通过Mock的方式来测试

    现在觉得是不是测的有点过于细了 比如 返回的行业 数据库中是逗号分割的字符串 返回给前端是一个行业数组 连VO中的的getIndustries()都测试了

    assertNull(vo.getIndustries())
    asserttArrayEquals(new String[]{"行业一","行业二"}, vo.getIndustries())
    展开

    作者回复: 很赞的分享!

    严格地说,还不够细,逗号分隔的字符串解析也应该拆出来。

    程序员越舍不得在前期花时间,就越要在后期花时间。

    
     1
  • zhengfc
    2019-02-26
    老师您好,如果方法足够简单的话,就可能导致大部分要不需要测试的代码是私有方法,会有这问题吗?

    作者回复: 首先,无论什么代码,只要是你写的,都应该测;其次,如果你是现在先写代码,后写测试的角度,才会考虑这个问题,先考虑怎么测,就不会问私有代码怎么测了。

    
     1
  • williamcai
    2019-02-18
    原来一直以为开发之后,手动测试一下功能就ok了,原来开发之前把测试写好是多么的难

    作者回复: 所谓的难,实际上是练习少。

    
     1
  • 俊伟
    2019-02-11
    以前我一直觉得先开发完,再写测试。而现在,通过专栏学习让我明白了,要去站在测试的角度去写代码。首先写测试,然后再想办法去实现逻辑。写代码的时候要时刻记住"我的代码应该怎么写才可以通过测试"。
    其次测试还要写的尽可能简单,一个测试只测试一个功能。测试还不能依赖外部的环境,测试可以重复运行,而结果要保持一致。测试也是也要符合代码的规范。测试还要确保覆盖所有情况,不能出现无断言的测试。

    作者回复: 其实,测试驱动开发才是最好的以终为始案例。

    
     1
  • 捞鱼的搬砖奇
    2019-02-04
    测试不仅是测试人员的工作。更是开发人员的工作。之前的工作的中自测,常常潜意识的里只会考虑正常的情况,比如输入姓名的input,只会输入不超过三个字符的长度,到测试手冲,会输入一长串,因为程序中没有做长度检查,超过数据库字段长度成都就挂了。后来自己总结,发现测试人员的测试会带着破坏的性质,开发人员总是认为一切操作都是合理的。

    看完了文章后,会继续完善之前的总结。把什么场景可能出现什么情况,罗列出来,方便工作中的对照检查。

    作者回复: 程序员要学点测试知识,比如,测试等价类的划分,破坏性测试等等,当你开始重视测试了,代码质量才会提高。

    
     1
  • 漂泊者及其影子
    2019-02-04
    新年快乐,基于spring的单元测试启动慢,耗内存,耗CPU,怎么解决

    作者回复: 涉及到Spring就不是单元测试,至少是集成测试了,参见前面的测试金字塔,多写单元测试。集成测试慢点是可以接受的。

    
     1
  • 丁丁历险记
    2019-11-08
    没用永恒的银蛋,千万别指望测试解决架构设计的问题。
    
    
  • 学习使人快乐
    2019-10-29
    明白了测试代码的重要性
    
    
  • hua168
    2019-03-29
    老师,idea测试用Junit5还是其它比较方便?

    作者回复: IDEA 对 JUnit 的4和5支持得都挺好。

    
    
  • enjoylearning
    2019-03-28
    测试中的3A原则么,还有测试代码中的for循环要如何避免,难道抽出来放到测试辅助类里去?

    作者回复: 可以用测试的3A原则来理解。

    测试里就不应该有 for 循环,你为什么要有那么多结果去检查呢?用少量数据也是可以的,你需要理解测试等价类的概念。

    
    
  • 虢國技醬
    2019-03-15
    打卡
    
    
  • 梦倚栏杆
    2019-03-11
    从数据库或者第三方api查询类内容需要写测试吗?这种测试怎么写呢?

    如果不需要写,两会发现大量展示类系统不需要写测试了,感觉怪怪的
    
    
  • 红糖白糖
    2019-03-10
    1. 有断言 -- 就是测试时可以自判断的,即测试自己知道成功还是失败,不需要人工去判断。
    2. 测试的写法: given -- when -- then
    3. 测试的基础设施搭建好了之后,测试写起来就会很快了。比如常用的使用buildXX(或者是DBUNIT)准备数据、tearDown清理数据。
    
    
  • zhengfc
    2019-02-26
    多打了了不字
    
    
  • 九月三秋
    2019-02-11
    让我感觉到写测试是相当重要
    
    
  • 毅
    2019-02-04
    祝新年快乐!

    编辑回复: 新年快乐🎉

    
    
我们在线,来聊聊吧