首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

单元测试与重构

平时总能听到“这段代码是有问题,但是现在不敢改”、“这段代码不敢动,所以复制了一份在此基础上进行增改”等等这样的话,这些问题总归来讲,就是没有做好单元测试。...在实际开发工作中,经常能见到长达100行及以上的函数/方法,这种代码绝大部分开发者会说不具备可测性。如果写代码时时刻想着可测性,是为了让测试通过,开发者再写这么长行数的代码都难。...既然测试也是用代码写的,那么如何保证测试代码的准确性呢?只有一个方法:把测试写简单,简单到一目了然,不需要证明它的正确性。 一种测试常见的坏味道是没有断言!...其中边界测试有个CORRECT的缩写: Conformance(一致性):值是否和预期一致。可以理解为当输入并不是预期的标准数据时,被测试方法是否可以正确输出预期结果(或抛出异常)。...Reference(依赖性):代码是否引用了一些不在代码本身控制范围之内的外部资源,当这些外部资源存在或不存在、满足或不满足时,代码是否可以产生相应的预期结果。

81340

Android单元测试框架Robolectric3.0(二):数据篇

,主动或被动的留下来大量坏味道的代码,在短时间内顺利的完成项目,此后却花了数倍于开发的时间来维护此项目,可谓“前人砍树,后人遭殃”,讽刺的是,砍树的人往往因为优秀的绩效,此时已经步步高升,而遭殃的往往是意气风发...(3)是不是对重构没信心?这个话题太老生常谈了,配备有价值的、高覆盖率的单元测试可解决此问题。 (4)当你在写Android代码(比如网络请求和DB操作)的时候,是如何测试的?...关于第二个问题,己所不欲勿施于人 我始终觉得让QA写UT,是一种傻叉的行为。单元测试是一种白盒测试,本来就是开发分内之事,难道让QA去阅读你恶心的充满坏味道的代码,然后硬着头皮写出UT?...这种做法不仅仅可以在写UT的过程中使用,在开发过程中也可以使用,当服务端的接口开发滞后于客户端的进度时,可以先约定好数据格式,客户端采用模拟网络请求的方式进行开发,此时两个端可以做到不互相依赖。...网络请求的异步回调如何进行测试 关于网络请求之后的回调函数如何测试,笔者暂时也没有什么自己觉得满意的解决方案,这里提供一种做法,权当抛砖引玉,希望有此经验的人提供更多的思路。

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    『Go 语言学习专栏』-- 第十一期

    大多数使用的是契约测试,即也是使用框架,对生产者和消费者独立测试,消费者和生产者相互独立,相互解耦,调用API,和预期的结果对比。...编程领域内还有一个重要的思想,叫TDD, 即测试驱动开发。 编写一个测试,再写函数,直到测试通过,如此循坏。...(当然实际上测试驱动开发,真正实施还是略微有点困难,一般的做法都是开发、测试,而不是测试、开发、测试、开发) 一般的初学者,是不太会关注测试,在没有进入职场之前,我甚至完全没关注测试,直到走入职场......test.Errorf("wrong: result=%d actual=%d", result, t.result) } } } 先给定一堆测试数据,再遍历测试数据,调用函数,看结果是否和预期一致...总结 本节探讨了go 中的单元测试的编写,主要是包括:一般单元测试的编写、表格驱动的单元测试的编写、第三方库框架的单元测试的编写。 希望对你有所启发。

    54830

    浅析 FP:JavaScript 中的纯函数

    前言 纯函数 是一个常见的概念,在日常工作中也经常会遇到,它其实非常简单,今天我们来了解一下它的好处以及为什么要使用它。...其实不需要修改外部的 isValid 变量,我们只需要在函数中将验证的结果 return 出来: const user = { username: 'savokiss' } function validate...那我们如果换成纯函数版本的 greet ,所有都是那么自然~ 只需要修改单元测试中传入的参数即可! 可缓存性(Cacheable) 纯函数可以根据输入来做缓存。...实现缓存的是一种叫做 memorize 的技术。 下面的代码来自 Vue 源码: /** * Create a cached version of a pure function....,如果多次调用就会返回缓存后的值,从而节省计算资源,而这一切的前提都建立在传入 cached 中的那个函数为纯函数的基础上。

    61620

    set 方法是坏味道?

    没错,在这种思路下,可变数据(Mutable Data)就成了一种坏味道,这是 Martin Fowler 在新版《重构》里增加的坏味道,它反映着整个行业对于编程的新理解。...这种想法源自函数式编程,数据建立在不改变的基础上,如果需要更新,就产生一份新的数据副本,而旧有的数据保持不变。...所以,Martin Fowler 在《重构》第二版里新增了可变数据作为一种坏味道,这其实反映了行业的理解也是在逐渐推进的。...那么,在实际工作中,我们怎么设计不变类呢?...在实践中,完全消除可变数据是很有挑战的。所以,一个实际的做法是,区分类的性质。值对象就要设计成不变类,实体类则要限制数据变化。

    36440

    测试用例模板和例子

    ”的说明 测试数据 用户名=yiyh 密码=1 操作步骤 操作描述 数 据 期望结果 实际结果 实际结果 测试状态(P/F) 1 输入用户名称,按“登陆”按钮。...4、测试用例不应该包含实际的数据; 测试用例是“一组输入、执行条件、预期结果”、毫无疑问地应该包括清晰的输入数据和预期输出,没有测试数据的用例最多只具有指导性的意义,不具有可执行性。...5、测试用例中不需要明显的验证手段; 我见过很多测试工程师编写的测试用例中,“预期输出”仅描述为程序的可见行为,其实,“预期结果”的含义并不只是程序的可见行为。...集成测试是在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指标及要求的活动。...从图1可以看出,集成测试需要花费的时间远远超过单元测试,直接从单元测试过渡到系统测试是极不妥当的做法。

    1K20

    码农,你真的了解TDD和BDD吗?

    因为在很多单元测试框架运行测试的过程中,测试不过时会用红色展示测试结果,而通过时则采用绿色进行展示,这已经成了单元测试框架约定俗成的规则。...对很多人来说,TDD 是一种难以接受的做法,抛开理念上的差异,更重要的原因是,写测试无从下手。很多时候写不出测试,主要是面对的需求太大了。...我们都知道,在软件开发中最重要的一个概念就是分层,也就是在一些模型的基础上,继续构建新的一些模型。...单元测试框架写测试的方式更多的是面向具体的实现,这种做法的层次是很低的,BDD 希望把这个思考的层次拉高。拉到什么程度呢?...如果登录方式有所调整,用户输完用户名密码自动登录,不需要点击,那这个用例是不是需要改呢?下面我换了一种方式描述,你再感受一下。

    98510

    区块链如何能颠覆谷歌的广告经济

    如今,类似于智能手机和社交平台的是区块链和加密网络,它们是建立在分布式副本基础上的。与任何平台一样,区块链实际上是一种设计空间,可以让其他人在设施的基础上进行构建。...在这些类型的网络上建立的协作团队正在为他们的工作带来一种高质量,在Facebook这样的平台上已经被严重侵蚀了。...70年代的开发人员建立在开放网络上,使用web标准和分散的协议,他们可以得到信任,所以那些在区块链上工作的人正在开发具有这种质量的产品和服务。...这还有额外的好处:消费者可以依赖产品,而投资者可以支持这些公司,因为他们知道,该平台拥有确保无坏结果的机制。 这很可能是未来10年新兴平台的基础。...我们离这还有几年的时间,但未来发展的一种方式可能是投资者Charlie Munger所说的的一句话:“给我看看激励,我会给你展示结果。”

    48400

    信息时代的思维方式:量级、时代的基线、极限(边界)

    引言 控制论、信息论和系统论,是新时代的科学基础和方法论。在新的时代,需要掌握新的方法论。 将思维方式用于工作和生活中,就是一种方法论。...生活在小数字世界里的人,天然地缺乏处理大数字世界里的问题的思维方式,无形之中将人们限制在天花板之下。...人工智能是建立在网络效应基础上的,它是通过很多彼此联系的计算机共同协作工作而产生的。 集中很多人的智慧,产生叠加的效果 1.6 自顶向下和自底向上 人适合自底向上。...从工程的角度讲,好和坏,只是在固定成本下相对的表现。 计算机里面无论是软件设计,还是硬件设计,都是在平衡性能和成本的关系。 II 工程思维:在边界里面做事情,遵循一套工程思路解决问题。...可以理解成直到今天为止人类所掌握的工程知识。我们所有的工作,应该建立在这条线的基础上,而不是从它的下面开始做起。

    28230

    GitHub Copilot代码质量争议升级,官方数据发声!你站哪边?

    但仍然有个问题争论不休:客观上,使用 GitHub Copilot 编写的代码质量是好是坏?...然后,通过单元测试和开发人员进行的专家评审来评估代码。 研究结果表明,使用 GitHub Copilot 编写的代码具有增强的功能和可读性,质量更好,并且获得批准率更高。...我这是对开发人员逐行代码审查的分析的结果: 代码错误的平均值 平均代码行数 每个错误代码的平均行数 差异 使用GitHub Copilot 4.63 84.3 18.2 13.6 不使用GitHub...在实际设置中,这意味着使用 GitHub Copilot 的开发人员编写的代码可以更快地合并,这将加快修复错误或部署新功能的时间。...这些数据建立在我们之前的研究基础上,表明 GitHub Copilot 是一款功能强大的产品,可以帮助开发人员更快地编写代码并提高工作满意度,并使团队能够快速行动并增强他们的创造力和创新能力。

    10710

    软件敏捷开发 TDD 方案

    这里的B并非指的是Business,实际上BDD可以看作是对TDD的一种补充,让开发、测试、BA以及客户都能在这个基础上达成一致,JBehave之类的BDD框架。...DDD:领域驱动开发(Domain Drive Design) DDD指的是Domain Drive Design,也就是领域驱动开发,DDD实际上也是建立在这个基础之上,因为它关注的是Service层的设计...,不能测试的或觉得不需要测试的一律放弃; 在改/加任何功能代码前,一定要先想是不是要改/加测试用例; 功能/测试代码,结构不合理,重复代码等情况,在测试通过后,及时进行重构。...TDD的开发流程 分析并确定一个目标测试场景; 添加一个单元测试来验证该测试场景的输入输出; 运行该测试,得到失败的测试结果; 写最简单的功能代码来通过该测试; 再次运行该测试,看到测试通过; 进行代码重构...什么是有效的单元测试,有很多人写测试,连到底在测什么都不清楚,也可能连断言都没有,通过控制台输出,肉眼对比来验证。

    1.8K50

    「求职」跳槽面试高频&棘手问题作答方式

    先说一个常见的职业类问题“经常跳槽是好是坏?” 这个问题相信很多同学的答案都是“坏”。确实,在大多数情况下,经常跳槽是不好的。...(HR内心:那是不是你的性格有什么问题?或者工作不到位?)...这个问题也是面试中常遇到的,回答的好与坏,结果天差地别。 分析一下:面试官希望招聘的同学,一定是有充分思考,做过一定匹配才投递的岗位,而不是浪投。...回答思路:在现有薪资基础上上浮20%-50%,太低会让HR觉得你着急入职,怀疑你是否是被裁的;太高会让HR觉得你对当前市场和定位不了解,但凡有性价比高一些的同学,你本次面试就结束了。...好的回答:我的期望薪资是在现有全包的基础上增加30%,我认为当前的能力和知识的储备,足以为业务带来对应的价值。 以上就是本期的内容分享。

    22210

    豆瓣 9.1!二刷了这本经典,YYDS

    学习重构必看的一本神书《重构:改善代码既有设计》从两个角度给出了重构的定义: 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。...开发一个新功能之后&之前 在开发一个新功能之后,我们应该回过头看看是不是有可以改进的地方。在添加一个新功能之前,我们可以思考一下自己是否可以重构代码以让新功能的开发更容易。...我们在阅读理解代码的时候,如果发现一些坏味道的话,我们就可以对其进行重构。...再比如说我们代码有一个类专门负责数据脱敏,我们为了验证脱敏是否符合预期专门为这个类写了一个单元测试。 单元测试也是需要重构或者修改的。...某些情况下我们不应该进行重构: 学习了某个设计模式/工程实践之后,不顾项目实际情况,刻意使用在项目上(避免货物崇拜编程); 项目进展比较急的时候,重构项目调用的某个 API 的底层代码(重构之后对项目调用这个

    39020

    测试你的红包代码

    最简单直接的方法就是,调用一下代码,给一组输入数据,把结果打印出来,肉眼看一看是不是正确。以我的代码为例: print redPacket(5, 2000) 别忘了我们使用的单位是“分”。...“浮点精度”,一个小数的实际值和显示值会有一定的误差。...比如可以在 python 命令行里试一下 1.1 + 2.2 == 3.3,看看结果是什么。 因此,在判断小数是否相等时,一般都采用判断差值是否小于一个很小值。 运行代码,你将会看到所有测试的结果。...如果没有 ERROR 的输出,就表示所有测试都是符合预期的。 这也是通常在开发中的一种做法:除了完成功能代码外,再提供一套测试代码,用来验证功能代码是否正确,保证代码质量。...这种对于单个功能进行验证的测试被称作“单元测试”。 有不少用来做测试的模块,其中 unittest 就是 python 自带的一个做单元测试的模块。

    1.4K70

    一个完整的TDD演练案例(二)

    关键在于,我们该如何编写单元测试来验证生成的结果。我们对结果的要求是: 数字必须是0…9之间; 产生的四个数字不能相同; ---- 讨论:究竟由谁来承担“随机生成答案”的职责?...一种做法是获取Answer的属性,然后再进行验证。那么,为了测试的验证而暴露这些属性,是否适合? 要完成对答案正确性的验证,直接暴露答案的属性是不妥当的,至少目前没有获取答案属性的需求。...毕竟,这种对答案正确性的校验,也可以说是业务逻辑的一种。 说明:在开始编写“检查输入是否合法”任务时,你会发现,这里所谓多余的验证,就会派上用场。...---- 知识:JUnit中对异常的验证 随着JUnit版本的演化,先后提供了三种验证异常的机制。 一种是传统的在测试代码中通过编写try... catch结合fail()方法进行验证。...生成随机数自然是调用Java的JDK。在单元测试环节中,倘若我们要测试的单元需要调用别的API,则在这个测试中,我们可以假定这个API是正确的。我们对Java JDK的正确性自然信心十足。

    81830

    激活和留存

    增长黑客的拉新和常规市场/运营的拉新区别在于,增长黑客更看重的是新用户为产品带来的实际价值,这个价值可以是电商产品中的用户购买转化,也可以是内容社区产品中的用户看帖、发帖、评论,在追求新用户数量的同时,...新用户下载APP可能带有一定的预期,比如下载共享单车的APP是为了骑车,如果下载完APP发现想骑车的时候找不到车,或者第一次骑车就碰到了一辆坏的,那么这就和用户的预期不符,用户没办法体验到共享单车带来的便捷性...共享单车想要激活用户,就是多投放单车数量,新用户可以很顺利的骑车,至于车好不好骑,骑某个品牌的单车帅不帅,这些都是建立在能找到车的基础上。...通过激活环节,用户体验到了产品的价值,这个时候用户的留存意愿是最高的,产品功能带来的新鲜感、好奇感、解决需求的有效性让用户会持续使用产品一段时间,但是当新鲜感或者用户的需求不再那么强烈以后,对产品的使用频次也就没那么高了...所以说,活跃用户是留存中的一种用户状态,活跃度是衡量用户的一个指标,用户越活跃,进行付费或分享的可能性就越大,也就是说用户越活跃,那么对产品带来价值贡献的可能性就越高。

    97710

    软件测试方法课程笔记(3)

    白盒测试 这是一种验证技术,软件工程师可以用它来检查他们的代码是否按预期工作。 它考虑到系统或组件的内部机制。 它也被称为结构测试,清楚的盒测试和玻璃盒测试。...单元测试的过程: 在详细设计阶段完成单元测试计划 建立单元测试环境,完成测试设计和开发 执行单元测试用例,并且详细记录测试结果 判定单元测试是否通过 提交单元测试报告 单元测试的优点: 单独进行,一起进行...集成测试 集成测试的概念: 集成测试是软件测试的阶段, 其中将各个软件模块作为一个组合进行测试. 集成测试在单元测试之后并且在系统测试之前. 在集成测试之前,单元测试已经完成。...软件质量 满足用户需求; 建立合理的进度、成本与功能的关系; 具备扩展性和灵活性; 能有效的处理例外情况; 保持成本和性能的平衡 软件质量保证 为了确保软件开发过程和结果符合预期的要求,而建立的一系列规程...测试的度量 四个一般核心领域,可以协助设计有效的度量标准 时间表相关的度量用来量度各种各样活动实际完成所用的时间和估计时间的比较。 质量相关的度量用来量度产品或过程的质量。

    52450

    软件测试分类有那些,你还知道吗

    单元定义:C中指一个函数,Java中指一个类,在图形化的软件中,单元一般指一个窗口,1个菜单。 回答以下小问题: 1.什么时候进行单元测试? 2.由谁来做单元测试? 3.单元测试的依据?...4.单元测试的通过标准? 5.国内单元测试的现状? 6.如何进行单元测试? 集成测试 又叫组装测试,通常在单元测试的基础上,将所有程序模块进行有序的、递增的测试。重点测试不同模块的接口部分。...动态测试 是指实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程。 4 验收测试(其他分类) α测试 1、Alpha 是内测版本,即现在所说的CB。...软件正式版本推出之前的几个版本, 需要有人测试一下, 看看是不是有问题。...简单来说,阿尔法测试主要是测试人员在开发环境下的测试,贝塔测试是在实际环境中的测试,或者公司内部人员在模拟真实环境中的测试。

    1.1K30

    学习单元测试,告别祈祷式编程

    目的: 通常用单元测试来验证代码逻辑是否符合预期。完整可靠的单元测试是代码的安全网,可以在代码修改或重构时验证业务逻辑是否正确,提前发现代码错误,减少调试时间。...Arrange--准备数据 Act--运行代码 Assert--判断结果是否符合预期 比如我们要给下面这段代码(golang)加单元测试: func Add(x, y int) int { return...= tt.want { // 数据错误的时候有明确标明测试数据,期望结果和实际结果,这一点还是有用的 t.Errorf("multiply(...代码比较长(这里只列出来了三个用例,实际上并没有完整覆盖全部结果) 测试方法如果出错了并不容易定位位置(三个测试数据都在一个方法,任何一个错误都会指向到同一个位置 有个测试的数据比较长,不太能直观判断测试数据是否正确...然后在这个子集的基础上在针对边界值做一些检查,比如36000、144000 等。 私有方法如何测试 通常情况下,如果私有方法在公有方法中有被调用,通过测试公有方法就已经可以间接测试到私有方法。

    56830

    自动化运维持续集成

    三、持续交付(Continuous delivery,缩写为 CD) 持续集成 -> 再次测试 -> 结果发布 CD 是一种软件工程手法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况...另一方面,持续交付是一种自动化交付的手段,关注点在于将不同的过程集中起来,并且更快、更频繁地执行这些过程。因此,DevOps 可以是持续交付的一个产物,持续交付直接汇入 DevOps。...四、持续部署(Continuous Deployment) 持续部署则是在持续交付的基础上,把所有的变更自动部署到生产环境中。...构建,实现功能模块构建测试,保证该模块当前的可用状态。 测试,单元测试和集成测试,保证各个功能模块的完整性和稳定性。 交付,建立在CI基础上,让软件的构建、测试与最终版本变得更快以及更频繁。...部署,是在持续交付的基础上,把部署到生产环境的过程自动化。 回滚,一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。 ?

    95320
    领券