文档章节

assert用于PHP的debug

hirainn
 hirainn
发布于 2016/08/03 16:42
字数 677
阅读 31
收藏 0

在说assert之前,先说一下assert的选项配置函数assert_options()。

mixed assert_options ( int $what [, mixed $value ] )

常量                 INI设置               默认值   描述
ASSERT_ACTIVE	    assert.active	    1	启用 assert() 断言
ASSERT_WARNING	    assert.warning	    1	为每个失败的断言产生一个 PHP 警告(warning)
ASSERT_BAIL         assert.bail             0	在断言失败时中止执行
ASSERT_QUIET_EVAL   assert.quiet_eval       0	在断言表达式求值时禁用 error_reporting
ASSERT_CALLBACK	    assert.callback	 (NULL)	断言失败时调用回调函数

再说assert()

php官方手册对assert的描述是检查一个断言是否为false。

在php5中,assert的函数描述为
bool assert ( mixed $assertion [, string $description ] )
在php7中,assert的函数描述为
bool assert ( mixed $assertion [, Throwable $exception ] )

如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。 assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式。 这意味着如果你传入了 boolean 的条件作为assertion,这个条件将不会显示为断言函数的参数;在调用你定义的assert_options()处理函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串。

assert() 回调函数在构建自动测试套件的时候尤其有用,因为它们允许你简易地捕获传入断言的代码,并包含断言的位置信息。 当信息能够被其他方法捕获,使用断言可以让它更快更方便!

回调函数应该接受三个参数。 第一个参数包括了断言失败所在的文件。 第二个参数包含了断言失败所在的行号,第三个参数包含了失败的表达式(如有任意 — 字面值例如 1 或者 "two" 将不会传递到这个参数)。 PHP 5.4.8 及更高版本的用户也可以提供第四个可选参数,如果设置了,用于将 description 指定到 assert()。

对于对面对象来说,最小的单元是方法,assert在做单元测试的时候尤为有效。

下面简单模拟一个断言测试

<?php
function test($a,$b){
	return $a+$b;
}

function my_assert_handler($file, $line, $code, $msg)
{
    echo "<hr>Assertion Failed:File '$file'<br />Line '$line'<br />Code '$code'<br />Msg '$msg'<br /><hr />";
}

function testUnit($method,$arguments,$expect) {
	assert_options(ASSERT_ACTIVE,1);
	assert_options(ASSERT_WARNING,0);
	assert_options(ASSERT_CALLBACK,'my_assert_handler');
	$str = "$method(";
	foreach($arguments as $v) {
		$str .= $v .',';
	}
	$str = substr($str, 0,-1);
	$str .= ')';
	assert("$str == $expect","the result of $method is unexpecting");
}
testUnit('test',array(1,2),3);
testUnit('test',array(1,2),4);
testUnit('test',array(4,5),9);
testUnit('test',array(3,7),11);
?>

期望值与实际结果不同的,则会调用回调函数,就得知那些方法与预期不符

© 著作权归作者所有

hirainn
粉丝 35
博文 82
码字总数 62905
作品 0
深圳
程序员
私信 提问
C++ primer第二次阅读学习笔记(第6章)

第六章 在switch中只有在最后一个case或是default语句之后才能定义变量,之所以这样规定是为了避免代码跳过变量定义和初始化。 如switch(val) { case xx: break; case yy: int i;//错误,该变...

长平狐
2012/10/08
77
0
Debug与Release版本的区别详解

Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当然也可...

长平狐
2012/10/08
1K
0
Codeception 2.2.9 发布,全堆栈 PHP 测试框架

Codeception 2.2.9 发布了,Codeception 是一个全堆栈的 PHP 测试框架。 测试示例: 更新内容: [Laravel5] Laravel 5.4 support [WebDriver] Added to wait for element, and run actions ......

王练
2017/02/05
541
0
防御性编程

Author:bakari Date:2012.8.25 本篇是我根据网上的一些陈述经过整理和总结而得。其中详细的内容我会标注出处。看不懂的可以查看原文. 一、什么事防御性编程 详细请见:http://www.uml.org....

chambai
2012/08/27
0
0
Debug与Release的区别

VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发...

尤加辉
2012/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
1
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
2
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部