程序员的测试课
郑晔
开源项目 Moco 作者
18911 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 23 讲
加餐 (1讲)
结束语 (1讲)
程序员的测试课
15
15
1.0x
00:00/00:00
登录|注册

01 | 实战:实现一个 ToDo 的应用(上)

你好,我是郑晔。
这一讲是我们整个专栏的第一节课。我在开篇词里说过,很多程序员之所以不写测试,一个重要的原因是不会写测试。所以,我们不玩虚的,第一节课直接带你上手实战。
我们要实现的是一个 ToDo 的应用,选择一个新项目开始,我们没有历史负担,对于学习如何写测试来说,是最容易的。整个实战分为了上下两节课,在这节课里,我们先来实现业务的核心部分,下一节课,我们把完整的应用实现出来。
这个 ToDo 应用本身非常简单,实现功能并不是我们这两节课的重点。一方面,你会看到如何解决问题的过程,比如,如何分解任务、如何设计测试场景、如何把测试场景转换为一个测试用例等等;另一方面,你也会看到,我是如何运用这些解决问题的过程一点点把问题解决掉,在整个开发的过程中如何写测试、写代码。
当你在实际工作中面对更复杂的问题时,这里面的代码对你的帮助可能不大,但这些解决问题的思路却会在工作中实际帮助到你。如果你订阅过我的前几个专栏,这算是一个完整的实战练习。

项目前的准备

在正式开始之前,我们一块来看下这个 ToDo 应用都有哪些具体需求(注:接下来的代码我会用 Java 来写,如果你没有购买过我的其他课程也没有关系,极客时间有免费试读额度,欢迎你点击文章里的超链接进行学习)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文是《实现一个 ToDo 的应用(上)》的第一节课,通过实战演示如何编写测试,以及解决问题的思路。作者首先介绍了ToDo应用的具体需求,包括添加、完成和查看待办事项的功能。接着,作者提到了项目前的准备工作,包括项目自动化和需求设计。在设计先行部分,作者使用DDD战术设计方法识别了核心对象、领域服务和Repository,并解释了它们在应用中的作用。整体而言,本文重点介绍了如何准备项目、设计需求和实现设计,为读者提供了一次实战练习的机会。 文章通过实例演示了如何从需求出发,逐步实现一个ToDo应用的功能。作者首先介绍了从领域服务开始实现每个服务的思路,然后详细讨论了如何设计可测试的函数接口,并提出了对不同输入情况的处理方式。通过分析正常和异常情况,作者建立了对输入参数检测和Repository异常处理的设计规范。最后,文章引导读者动手写代码,将理论知识付诸实践。 总的来说,本文以实战演示为主线,通过具体的例子和思考过程,帮助读者理解如何从需求出发,设计可测试的函数接口,并建立设计规范。这为读者提供了一个实践机会,帮助他们更好地理解和应用所学的知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的测试课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • sylan215
    这个例子比较简单,挺适合刚开始入门测试的人,但是同时,也可能会让开发觉得,这么简单的逻辑,一看就知道对不对、有没有问题了,何必还要用自动化测试进行覆盖呢? 一方面,这确实只是个例子,但是也不能因为简单,就不写用例,因为所有的代码都不可预知的在后面发生改变,那么作为后续的回归用例,也是一样有用的; 另一方面,需要关注 mock 的使用,实际业务场景很复杂,函数之间相互调用逻辑更是很常见,所以会经常用到 mock,但是 mock 也不可避免的会让我们规避了集成测试的测试点,所以怎么选取合适的 mock 点,并预知 mock 的风险,也是要了解的。 再补充,就算自己写了测试用例,也不要完全的依赖测试来发现所有的问题,代码思维、设计风格、编码习惯,这些预防问题发生的手段,才是最有效的。 以上,期待后续的精彩内容。

    作者回复: 很多人是简单的事情做不好,复杂的事情搞不定

    2021-08-12
    3
    14
  • 李威
    文中是从sevice层入手写第一个测试,可否以整洁架构图中最内层的entity入手写第一个测试,代码实现也是按先实现内层,再逐步实现外层的代码?

    作者回复: 问题是,从实体开始要测什么呢?我们得有一个出发点,服务刚好可以和需求对上。

    2021-08-06
    6
  • asusual
    相比Junit,Spock框架测试起来要省事很多~

    作者回复: 多谢分享

    2021-08-22
    4
  • Geek_3b1096
    谢谢老师一步一步的说明添加TodoItem字段: content -> done -> index

    作者回复: 设计是演化出来的

    2021-08-25
    3
  • 小凯
    项目运行不起来 能贴一下具体的gradle版本信息吗?

    作者回复: 运行./gradlew,它会提你下载相应的gradle版本,这种做法就是为了保持所有人用一样的gradle版本。 BTW,gradle/wrapper/gradle-wrapper.properties里面包含了gradle的版本信息。

    2021-08-22
    3
  • Summer 空城
    List list(final boolean all); 这个接口不符合单一职责原则吧

    作者回复: 因为它很简单,我就放在一起了。如果复杂一点,我可能会考虑拆分。

    2021-08-05
    2
  • Kevin
    老师好,我是从10x程序员开始关注老师的课程,目前该课程已经学习完毕,受益匪浅。然后就开始继续学习软件设计之美,目前还在学习中。后来又看到代码之丑的ToDo项目,当时就在想也要参与一下。然后就思考怎么样才能写得出彩,第一点想到的就是要实践一下tdd。现在看到程序员的测试课这门课程,果然是英雄所见略同,哈哈哈! 因为我刚换了一个工作,主要会用C++来开发。所以这里先立个flag,使用C++来实践这个课程,采用tdd来实现这个ToDo的小项目。到时把GitHub工程发出来,请老师点评。 不过时间周期可能会比较长,我尽量努力。

    作者回复: 加油加油!

    2022-01-19
    1
  • 时尚女人的儿子😘
    我在实现例如 TodoItemService 之前, 通常都会先测试它的 输入和输出, 两个类被测试完成后, 我才去开始用测试实现TodoItemService. 但看了您的实现手法, 一个测试集就已经能够覆盖到了输入输出.感觉您这样更简单些. 不知道我想的对不对, 还是应该一个模块对应一个测试集呢?

    作者回复: 围绕着目标去做测试,我没有特别的想过输入和输出。

    2021-08-05
    2
    1
  • 布凡
    老师,java 新手,课程中的思路我都能理解,但是如果自己手动实践还是有一些问题,可以考虑出一个java开发环境安装的视频吗?

    作者回复: 你可以去找Java入门课程

    2022-05-09
  • 🌿
    关于应用服务的设计,老师哪个专栏或文章里面有详细说明?

    作者回复: 《软件设计之美》

    2021-09-22
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部