10x程序员工作法
郑晔
火币网首席架构师,前ThoughtWorks首席咨询师 ,TGO鲲鹏会会员
立即订阅
7975 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 程序员解决的问题,大多不是程序问题
免费
思考框架 (1讲)
01 | 10x程序员是如何思考的?
以终为始 (11讲)
02 | 以终为始:如何让你的努力不白费?
03 | DoD的价值:你完成了工作,为什么他们还不满意?
04 | 接到需求任务,你要先做哪件事?
05 | 持续集成:集成本身就是写代码的一个环节
06 | 精益创业:产品经理不靠谱,你该怎么办?
07 | 解决了很多技术问题,为什么你依然在“坑”里?
08 | 为什么说做事之前要先进行推演?
09 | 你的工作可以用数字衡量吗?
10 | 迭代0: 启动开发之前,你应该准备什么?
答疑解惑 | 如何管理你的上级?
划重点 | 关于“以终为始”,你要记住的9句话
任务分解 (11讲)
11 | 向埃隆·马斯克学习任务分解
12 | 测试也是程序员的事吗?
13 | 先写测试,就是测试驱动开发吗?
14 | 大师级程序员的工作秘笈
15 | 一起练习:手把手带你分解任务
16 | 为什么你的测试不够好?
17 | 程序员也可以“砍”需求吗?
18 | 需求管理:太多人给你安排任务,怎么办?
19 | 如何用最小的代价做产品?
答疑解惑 | 如何分解一个你不了解的技术任务?
划重点 | 关于“任务分解”,你要重点掌握哪些事?
沟通反馈 (12讲)
20 | 为什么世界和你的理解不一样
21 | 你的代码为谁而写?
22 | 轻量级沟通:你总是在开会吗?
23 | 可视化:一种更为直观的沟通方式
24 | 快速反馈:为什么你们公司总是做不好持续集成?
25 | 开发中的问题一再出现,应该怎么办?
26 | 作为程序员,你也应该聆听用户声音
用户故事 | 站在前人的肩膀上,领取属于你的高效工作秘籍
27 | 尽早暴露问题: 为什么被指责的总是你?
28 | 结构化:写文档也是一种学习方式
答疑解惑 | 持续集成,一条贯穿诸多实践的主线
划重点 | 一次关于“沟通反馈”主题内容的复盘
自动化 (12讲)
加餐 | 你真的了解重构吗?
29 | “懒惰”应该是所有程序员的骄傲
30 | 一个好的项目自动化应该是什么样子的?
31 | 程序员怎么学习运维知识?
32 | 持续交付:有持续集成就够了吗?
33 | 如何做好验收测试?
34 | 你的代码是怎么变混乱的?
35 | 总是在说MVC分层架构,但你真的理解分层吗?
36 | 为什么总有人觉得5万块钱可以做一个淘宝?
37 | 先做好DDD再谈微服务吧,那只是一种部署形式
答疑解惑 | 持续集成、持续交付,然后呢?
划重点 | “自动化”主题的重点内容回顾汇总
综合运用 (7讲)
38 | 新入职一家公司,怎么快速进入工作状态?
39 | 面对遗留系统,你应该这样做
40 | 我们应该如何保持竞争力?
答疑解惑 | 如何在实际工作中推行新观念?
划重点 | “综合运用”主题内容的全盘回顾
总复习 | 重新审视“最佳实践”
总复习 | 重新来“看书”
结束语 (1讲)
结束语 | 少做事,才能更有效地工作
10x程序员工作法
登录|注册

16 | 为什么你的测试不够好?

郑晔 2019-02-04
你好!我是郑晔。今天是除夕,我在这里给大家拜年了,祝大家在新的一年里,开发越做越顺利!
关于测试,我们前面讲了很多,比如:开发者应该写测试;要写可测的代码;要想做好 TDD,先要做好任务分解,我还带你进行了实战操作,完整地分解了一个任务。
但有一个关于测试的重要话题,我们始终还没聊,那就是测试应该写成什么样。今天我就来说说怎么把测试写好。
你或许会说,这很简单啊,前面不都讲过了吗?不就是用测试框架写代码吗?其实,理论上来说,还真应该就是这么简单,但现实情况却往往相反。我看到过很多团队在测试上出现过各种各样的问题,比如:
测试不稳定,这次能过,下次过不了;
有时候是一个测试要测的东西很简单,测试周边的依赖很多,搭建环境就需要很长的时间;
这个测试要运行,必须等到另外一个测试运行结束;
……
如果你也在工作中遇到过类似的问题,那你理解的写测试和我理解的写测试可能不是一回事,那问题出在哪呢?
为什么你的测试不够好呢?
主要是因为这些测试不够简单。只有将复杂的测试拆分成简单的测试,测试才有可能做好。

简单的测试

测试为什么要简单呢?有一个很有趣的逻辑,不知道你想没想过,测试的作用是什么?显然,它是用来保证代码的正确性。随之而来的一个问题是,谁来保证测试的正确性?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《10x程序员工作法》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

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

    作者回复: 很好的分享!

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

    作者回复: 很好的总结!

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

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

    2019-03-23
    1
  • 朱国伟
    我还是习惯先写代码 在写测试 如 有一个投资机会详情(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())

    作者回复: 很赞的分享!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    编辑回复: 新年快乐🎉

    2019-02-04
收起评论
22
返回
顶部