用Python编写干净 可测试 高质量的代码
您不必听信我的观点,也不必直接研究代码,可以通过其他方法明显地看出这两种风格之间的差异。第一种方法是实际度量得到测试的代码行数。Nose 是一种流行的 Python 单元测试框架扩展,它可以方便地自动运行一批测试和插件,比如度量代码覆盖率。通过在开发期间度量代码覆盖率,会很快看出对于由大函数组成、包含深度嵌套的逻辑、以非一般化方式构建的代码来说,测试覆盖率几乎不可能达到 100%。
度量差异的第二种方法是使用静态分析工具。有几种流行的 Python 工具可以为 Python 开发人员提供多种指标,从一般性代码质量指标到重复代码或复杂度等特殊指标。可以用 pygenie 或 pymetrics 度量代码的圈(cyclomatic)复杂度(见 参考资料)。
下面是对相当简单的 “干净” 代码运行 pygenie 的结果示例:
pygenie 的圈复杂度输出
% python pygenie.py complexity --verbose highlight spy
File: /Users/ngift/Documents/src/highlight.py
Type Name Complexity
----------------------------------------------------------------------------------------
M HighlightDocumentOperations._create_snippit 3
M HighlightDocumentOperations._reconstruct_document_string 3
M HighlightDocumentOperations._doc_to_sentences 2
M HighlightDocumentOperations._querystring_to_dict 2
M HighlightDocumentOperations._word_frequency_sort 2
M HighlightDocumentOperations.highlight_doc 2
X /Users/ngift/Documents/src/highlight.py 1
C HighlightDocumentOperations 1
M HighlightDocumentOperations.__init__ 1
M HighlightDocumentOperations._custom_highlight_tag 1
M HighlightDocumentOperations._score_sentences 1
M HighlightDocumentOperations._multiple_string_replace 1
正如在此示例中看到的,每个方法都极其简单,复杂度都低于 10,这符合 McCabe 提出的原则。在我的从业经历中,我见过在没有测试的情况下编写的巨大函数,它们的复杂度超过 140,长度超过 1200 行。毫无疑问,根本不可能测试这样的代码。实际上甚至无法确认它是有效的,也不可能重构它。如果代码的作者一直牢记测试,在保持 100% 测试覆盖率的情况下编写相同的逻辑,就不可能出现如此高的复杂度。
干净代码假想解决方案
现在,我们来看一个完整的源代码示例以及相配的单元测试和功能性测试,看看它的实际作用以及为什么说这样的代码是干净的。按照严格的指标,“干净” 的合理定义是代码满足以下要求:接近 100% 测试覆盖率;所有类和方法的圈复杂度都低于 10;用 pylint 得到的评分接近 10.0。下面的示例使用 nose 在 highlight 模块上执行单元测试和 doctest 覆盖率检查:
运行 nosetests 和覆盖率报告:100% 覆盖率
--cover-erase --exe
Doctest: highlight.HighlightDocumentOperations._custom_highlight_tag ... ok
test_functional.test_snippit_algorithm ... ok
test_custom_highlight_tag (test_highlight.TestHighlight) ... ok
Consumes the generator, and then verifies the result[0] ... ok
Verifies highlighted text is what we expect ... ok
test_multi_string_replace (test_highlight.TestHighlight) ... ok
Verifies the yielded results are what is expected ... ok
Name Stmts Exec Cover Missing
-----------------------------------------
highlight 71 71 100%
----------------------------------------------------------------------
Ran 7 tests in 4.223s
OK
如上所示,带几个选项运行了 nosetests 命令,highlight spy 脚本的测试覆盖率为 100%。惟一需要注意的是 --cover-package=highlight,它让 nose 只显示指定的模块的覆盖率报告。这可以非常有效地把覆盖率报告的输出限制为您希望观察的模块或包。可以从本文下载源代码,注释掉一些测试,从而观察覆盖率报告机制的实际工作情况。
用Python编写干净 可测试 高质量的代码相关推荐
- python编写代码_用 Python 编写干净、可测试、高质量的代码
用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...
- python编写高质量代码_用 Python 编写干净、可测试、高质量的代码
用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...
- 用 Python 编写干净、可测试、高质量的代码
简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R C" 的作者之一 Brian Kernigan 在 Software Tools 一书中总结了软件 ...
- 如何编写高质量的代码二 - 类的设计
2019独角兽企业重金招聘Python工程师标准>>> 如何设计类, 关键点: 类的接口应该提供一贯的抽象.很多问题都是因为违背了这个简单的原则. 类的接口应该隐藏某些东西,比如系统 ...
- iOS 编写高质量Objective-C代码(六)
级别: ★★☆☆☆ 标签:「iOS」「Block」「Objective-C」 作者: MrLiuQ 审校: QiShare团队 前言: 这几篇文章是小编在钻研<Effective Objecti ...
- 怎样编写测试类测试分支_编写干净的测试–天堂中的麻烦
怎样编写测试类测试分支 如果我们的代码有明显的错误,我们很有动力对其进行改进. 但是,在某些时候,我们认为我们的代码"足够好"并继续前进. 通常,当我们认为改进现有代码的好处小于所 ...
- 怎样编写测试类测试分支_编写干净的测试-被认为有害的新内容
怎样编写测试类测试分支 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该定义 ...
- 怎样编写测试类测试分支_编写干净的测试–从配置开始
怎样编写测试类测试分支 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该定义 ...
- 断言工具的编写_编写干净的测试–用特定领域的语言替换断言
断言工具的编写 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该定义也适用于 ...
最新文章
- 【C#公共帮助类】给大家分享一些加密算法 (DES、HashCode、RSA、AES等)
- TinyBERT搜索: 比BERT快10倍,小20倍
- keras 导出onnx并使用
- IoC(Inversion of Control,控制反转)模式
- 统计学习笔记(1)——统计学习方法概论
- iqueryable怎么进行操作_钢结构施工要点有哪些?怎么进行操作?
- php psockopen,基于php socket(fsockopen)的应用实例分析
- 《为iPad而设计:打造畅销App》——将iPad作为视频娱乐设备
- Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列
- cvf命令报错 linux,linux命令大全
- Nsight Compute Profile Kernel无法定位源码问题
- 方管图纸标注_图样中型材的标注方法
- spring 学习书籍
- whx带我刷JOI training
- nginx端口映射配置(Windows)
- 关于如何在coursera.org上旁听好课
- linux离线安装snap应用,Ubuntu使用snap安装常用软件
- 目标检测FPN(Feature Pyramid Networks)的使用
- 凹凸世界服务器维护到几点,凹凸世界手游2021年7月21日版本更新停服维护公告_凹凸世界手游2021年7月21日更新了什么_玩游戏网...
- java中转义字符的用法
热门文章
- 2018计算机专业考研34所,2018考研:计算机专业全球院校排名公布,上海交通大学竟排第一?...
- Launcher启动的流程图【AndroidICS4.0——Launcher系列四】
- android监听自身被卸载的方法
- 自定义元素探秘及构建可复用组件最佳实践 1
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!在eclipse.ini中为eclipse指定jdk启动...
- 切图崽的自我修养-[ES6] 编程风格规范
- 12.04 ubuntu 安装微软雅黑的字体
- windows 下使用github
- WebSphere中连接池的配置
- 施耐德EVlink 电动车充电站有新漏洞,可导致电动车遭劫持