第一节 理解单元测试

       在查看代码之前,最好提一下编写单元测试和使用单元测试的一些基本信息和规则。 记住这些基本规则并理解单元测试的重点非常重要。 单元测试不仅仅是一个很好的功能,而且是任何正规软件项目中绝对必要的部分。

       1.什么是单元测试

        一个简单的问题,什么是单元测试? 单元测试是在已知的上下文中使用已知的输入去执行另一段代码(函数/方法)的代码,将输出的结果与预期的结果进行比较, 这也称为断言。 以下代码片段是最简单的断言,验证一加一等于二,函数是否按预期的运行:

function sum($a, $b)
{
return $a + $b;
}
$this->assertEquals(2, sum(1, 1));

  2.断言(Assertions)

  断言是单元测试的核心和灵魂。一个断言往往也伴随着一定的约束。例如,你的 assertThat值必须符合约束。一个用于解释assertThat如何运行的优秀示例就是PHPUnit本身自带的一个很简单的断言 —— assertTrue() 。 代码如下:

public static function assertTrue($condition, $message = '')
{self::assertThat($condition, self::isTrue(), $message);
}

       以下是基本和最常用的断言:

  • assertTrue():这将验证条件是否为真
  • assertFalse():这将验证条件是否为false
  • assertEquals():它验证预期值和实际值是否相等,与PHP比较运算符==相同
  • assertSame():这类似于assertEquals(),但它检查值是否相同,与===运算符的方式相同
  • assertNull():这将验证该值是否为null
  • assertEmpty():这验证值是空的,但它使用PHP函数empty(),这意味着空可以是false,null,'',array()

但PHPUnit有许多不同的内置断言。 您可以在http://phpunit.de/manual/3.7/en/appendixes.assertions.html上的官方文档中找到这些断言的完整列表。但是如果您需要更多,可以通过扩展PHPUnit_Framework_Constraint类来创建自己的断言。

       3.单元测试的重要性

   单元测试使我们相信编写的代码可以按预期工作,并且它是开发人员可以依赖的可靠部分。 将代码分解为小的独立单元可以降低代码与另一段代码交互时引入错误的风险。 如果您需要花费和修改应用程序而不必担心更改的任何意外后果,这是最好的投资。 它也可以是一个很好的文档来描述代码的设计方式和应该做的事情。 另一个原因是重构。 在没有测试的情况下改变复杂的代码就像进入雷区一样。

       4.测试所有可能的场景

        测试所有可能的场景会很好,但考虑一个函数,如下面的代码片段所示:

function plusOne($a)
{
    return 1 + $a;
}

       PHP是一种松散类型的语言,你可以有很多场景。 但它通常是足以覆盖最期望或最重要的场景以及一些意想不到的场景(在我们的例子中,$ a可以是NULL或FALSE)

       但是你应该尝试的是测试尽可能多的代码,覆盖所有的if else 以及case 语句。尝试通过测试边缘情况来假设最坏的情况。 重要的是不仅要测试正面情况,获得预期结果,还要测试负面情况,以验证在抛出意外输入或异常时代码不会中断。

       5.什么是一个好的测试?

        以下是一些对任何单元测试有效的通用规则,而不仅仅是PHPUnit:

  • 独立:每个测试都需要独立于其他测试和环境运行。
  • 快速:要进行有用的测试并且能够尽可能频繁地运行它们(例如,作为提前或提交后的挂钩),测试需要快速。
  • 可重复:您应该能够根据需要多次运行测试并获得相同的结果。
  • 保持最新:测试编写一次,但代码可以更改或扩展。 如果你不打算更新测试,最初的测试投资只会浪费时间和金钱。 规则是,无论谁破坏了测试,都会修复测试。
  • 简短:测试应该只是几行 - 易于阅读和理解。
  • 弹性:一旦编写,测试不应改变,直到测试类/方法的行为发生变化。

      6.什么时候写测试?

       拥有100%的代码覆盖率(测试的代码量,但不一定是100%的代码覆盖率,这也意味着测试所有可能性)会很好。通常,更好的覆盖率意味着更好的质量项目。 检查GitHub上的几个开源项目,看看他们有多少测试,这可以让你了解这些项目的质量,这些项目的使用频率并不重要。 广泛使用的系统并不自动意味着高质量的代码。

       但更重要的是养成编写测试的习惯。 您可以尝试以测试为导向的开发方法,您可以将您的类想象为没有实现的接口,只是说明每个方法应该如何工作。 然后编写测试,准确描述您的期望,然后实现编写所需功能的接口,测试将验证它是否符合您的预期。

       第二种方法是编写类或函数,然后使用书面测试对其进行测试以验证功能。 规则应该是你在编写代码的同一天编写测试,因为以后你不会这样做,因为你将专注于其他事情。 绝对有必要让单元测试涵盖整个核心功能。这是必备功能。

转载于:https://www.cnblogs.com/mysic/p/9434417.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metro风格的Java组合框(JMetro)–重新介绍

我上一篇有关JMetro的文章–我的都市风格的Java外观(或外观)是关于日历选择器控件的外观 。 我本打算使用Tom Eugelink不错的日历选择器,但是当时我了解到它是由Oracle创建并随Java 8一起交付的,因此出于时间的考虑(几…

弹性盒模型--新版与旧版比较(2)

弹性空间与元素具体位置设置是加在子元素身上的 <style> body{   margin: 0; } #box{   height: 300px;   border: 1px solid #000;   新版弹性盒模型   /*display: flex;*/ 老版弹性盒模型   display: -webkit-box; } #box div{   /*新版*/   /*flex-g…

KNNClassifier

import numpy as npfrom math import sqrtfrom collections import Counterfrom .metrics import accuracy_scoreclass KNNClassifier: def __init__(self, k): """初始化kNN分类器""" assert k > 1, "k must be valid…

左斜杠和右斜杠有什么区别_「斜杠云」SEO推广和SEO优化有什么区别?

1&#xff0c;首先&#xff0c;从概念上来说&#xff0c;网络推广就是企业从开始申请域名、租用空间、网站备-案、建立网站、直到网站正式上线开始就算是介入了网络推广活动&#xff0c;而通常我们所指的网络推广是指通过互联网的种种手段&#xff0c;进行的宣传推广等活动&…

python算两个时间之间的天数,将天数转成int型

import time import datetime#计算两个日期相差天数&#xff0c;自定义函数名&#xff0c;和两个日期的变量名。 def Caltime(date1,date2):#%Y-%m-%d为日期格式&#xff0c;其中的-可以用其他代替或者不写&#xff0c;但是要统一&#xff0c;同理后面的时分秒也一样&#xff1…

并发编程-concurrent指南-阻塞队列BlockingQueue

阻塞队列BlockingQueue&#xff0c;java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列。 适用场景&#xff1a; BlockingQueue通常用于一个线程生产对象&#xff0c;而另一个线程消费对象的场景。 一个线程往里面放&#xff0c;另一个线程从里面取的…

博主自制丨免费下载丨免费使用丨仅用于测试

链接&#xff1a;点我立即下载 提取码&#xff1a;0j6h

使用JSTL视图探索Spring Controller

让我们通过对Spring MVC的Controller开发的更多探索来改进以前的Spring JDBC应用程序 。 我将展示另一种编写新的Controller的练习&#xff0c;该Controller处理HTML表单并在JSP视图页面中使用JSTL标签。 要在Spring MVC应用程序中启用JSTL&#xff0c;您需要将以下内容添加到…

CSS 小结笔记之em

1、为什么使用em em也是css中的一种单位&#xff0c;和px类似。很多人会疑惑为什么有了px之后还要使用em&#xff0c;而且em使用起来相对于px来讲比较麻烦。 em主要是应用于弹性布局&#xff0c;下面给出一个小栗子说明em的强大之处 <!DOCTYPE html> <html lang&quo…

java 向父类_Java基础——面向对象(Object父类)

原标题&#xff1a;Java基础——面向对象(Object父类)声明&#xff1a;本栏目所使用的素材都是凯哥学堂VIP学员所写&#xff0c;学员有权匿名&#xff0c;对文章有最终解释权&#xff1b;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。Object 父类&#xff1a;Object的方法…

fedora 不在sudoers文件中_COPR 仓库中 4 个很酷的新软件(2019.4) | Linux 中国

COPR 是个人软件仓库集合&#xff0c;它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准。或者它可能不符合其他 Fedora 标准&#xff0c;尽管它是自由而开源的。-- Dominik TurecekCOPR 是个人软件仓库集合[1]&#xff0c;它不在 Fedora 中。这是因为某些软件不符合轻松…

解决小程序里面的图片之间有空隙的问题???

1、将图片转换为块级对象 即&#xff0c;设置image为display:block; image {display:block;}2、设置图片的垂直对齐方式 即&#xff0c;设置图片的vertical-align属性为"top,text-top,bottom,text-bottom" image {vertical-align: top;vertical-align: text-top;…

使用Cassandra和Nutch爬网

因此&#xff0c;您想从互联网上收集大量数据吗&#xff1f; 有什么比Cassandra更好的存储机制&#xff1f; 使用Nutch可以轻松做到这一点。 人们经常在Nutch后面使用Hbase。 这可行&#xff0c;但是如果您是&#xff08;或想成为&#xff09;Cassandra商店&#xff0c;则可能…

弹性盒布局实例

今天给大家搞一个弹性盒布局的实例&#xff0c;最近一直在复习一些基础的东西&#xff0c;所以一直会跟大家分享一些基础的东西 说实话&#xff0c;最近感觉被掏空了&#xff0c;别问我为什么&#xff0c;谁去保健谁知道&#xff0c;哈哈&#xff0c;注意安全&#xff0c;好了步…

win7插了耳机还是外放_安卓手机用耳机听歌音量太大怎么办

大部分安卓手机控制音量不是线性调节的&#xff0c;很难随心调节音量大小&#xff0c;这导致用耳机插手机听歌的时候即使开了最低音量&#xff0c;很多人觉音量还是太大&#xff0c;尤其是在夜深人静的时候。怎么解决呢&#xff1f;个人整理了一些方法。一无需root&#xff0c;…

skype for business 无法共享桌面、无法传输图片

以管理员身份运行如下PowerShell命令&#xff0c;清除Skype for Business缓存记录 #以管理员身份运行如下PowerShell命令&#xff0c;清除Skype for Business缓存记录 Stop-Process -Name "lync*" Stop-Process -Name "outlook*" Stop-Process -Name "…

骨牌

DP,em.......&#xff0c;代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; int a[1100],b[1100]; int dp[1100][12005]; int n; int main() {cin>>n;for(int i1;i<n;i){cin>>a[i]>>b…

java 读取ppt文件_java使用poi读取ppt文件和poi读取excel、word示例

Apache的POI项目可以用来处理MS Office文档&#xff0c;codeplex上还有一个它的.net版本。POI项目可创建和维护操作各种基于OOXML和OLE2文件格式的Java API。大多数MS Office都是OLE2格式的。POI通HSMF子项目来支持Outlook&#xff0c;通过HDGF子项目来支持Visio&#xff0c;通…

vue lang_新疆人的“lang”是“浪”吗?

小编&#xff1a;“老王&#xff0c;天气这么热&#xff0c;过几天我们几个人约上要到巩乃斯lang起呢也享受一下避暑生活么&#xff0c;你去不去&#xff1f;“老王&#xff1a;”这个礼拜六礼拜天都有事呢礼拜六我乌什塔拉的姨娘家出嫁丫头呢礼拜天五号渠的阿哥家给娃娃娶媳妇…

js将canvas保存成图片并下载

<canvas id"canvas" width"400" height"400"></canvas> <div><button id"save">保存</button> </div>var arr [{locations:[[0,0],[200,200],[0,400]],color:"red"},{locations:[[0,0…