本节内容:
PHP浮点数比较
代码:
$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);
输出结果:
boolean false
原因出在哪里呢?
php中文手册中对于浮点数有以下警告信息:
Warning
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。
这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
因此,不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以,不要相信浮点数结果精确到了最后一位,也不要比较两个浮点数是否相等。
如果确实需要更高的精度,应该使用任意精度数学函数或 gmp 函数
将以上代码修改为:
$a = 0.1;
$b = 0.7; // www.
var_dump(bcadd($a,$b,2) == 0.8);
如此便解决了浮点数的计算问题。
特此分享,以帮助遇到同样问题的朋友。
本节主要内容:
PHPUnit Fixture
在编写测试用例时,可能最费时间的就是编写那些将程序设置到使用状态和测试完毕之后将其再设置回初始状态的代码了。
PHPUnit提供了setUp和tearDown这两个方法来解决这个问题。
setUp会在类的每个测试用例运行之前被调用,可以在里面做一些相关的程序初始化的工作
tearDown方法则会在本类每个测试用例运行完毕之后调用,你可以在里面进行一些相关的清理工作
需要注意的是,不一定写了setUp就要对应写tearDown,tearDown里面用来回收那些占用资源比较大的对象,如连接上的数据库,打开的文件等等。
简单的演示setUp方法例子:
除了setUp和tearDown之外,phpUnit还提供了一些方法来实现更多的准备工作,请看下图:
以上代码测试的结果,如下:
phpunit TemplateMethodsTest
PHPUnit 3.5.13 by Sebastian Bergmann.
TemplateMethodsTest::setUpBeforeClass
TemplateMethodsTest::setUp
TemplateMethodsTest::assertPreConditions
TemplateMethodsTest::testOne
TemplateMethodsTest::assertPostConditions
TemplateMethodsTest::tearDown
.TemplateMethodsTest::setUp
TemplateMethodsTest::assertPreConditions
TemplateMethodsTest::testTwo
TemplateMethodsTest::tearDown
TemplateMethodsTest::onNotSuccessfulTest
FTemplateMethodsTest::tearDownAfterClass
Time: 0 seconds
There was 1 failure:
1) TemplateMethodsTest::testTwo
Failed asserting that <boolean:false> is true.
/home/sb/TemplateMethodsTest.php:30
FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
本节主要内容:
PHPUnit参数详解
说明:本文直接翻译自PHPUnit官方文档,个人翻译水平有限,可能会存在某些词和意思翻译不准的地方,大家凑和看,呵呵。
Runs the tests that are provided by the class UnitTest. This class is expected to be declared in the UnitTest.php sourcefile.
UnitTest must be either a class that inherits from PHPUnit_Framework_TestCase or a class that provides a public static suite() method which returns an PHPUnit_Framework_Test object, for example an instance of the PHPUnit_Framework_TestSuite class.
运行类UnitTest提供的所有测试,这个类需要定义在UnitTest.php这个文件中.
类UnitTest需要从PHPUnit_Framework_TestCase继承或者提供一个公开的静态方法suite()返回一个PHPUnit_Framework_Test对象的实例.
phpunit UnitTest Test.php
Runs the tests that are provided by the class UnitTest. This class is expected to be declared in the specified sourcefile.
运行UnitTest提供的所有测试,这个类应该在定义在Test.php中
--log-junit
Generates a logfile in JUnit XML format for the tests run.
生成JUnit XML格式的日志文件
--log-tap
Generates a logfile using the Test Anything Protocol (TAP) format for the tests run.
生成TAP格式的日志文件
--log-dbus
Log test execution using DBUS.
使用DBUS记录测试的执行情况
--log-json
Generates a logfile using the JSON format.
生成JSON格式的日志文件
--coverage-html
Generates a code coverage report in HTML format.
生成html格式的代码覆盖报告
Please note that this functionality is only available when the tokenizer and Xdebug extensions are installed.
请注意这个功能只能在tokenizer和Xdebug安装后才能使用
--coverage-clover
Generates a logfile in XML format with the code coverage information for the tests run.
生成xml格式的代码覆盖报告
Please note that this functionality is only available when the tokenizer and Xdebug extensions are installed.
请注意这个功能只能在tokenizer和Xdebug安装后才能使用
--testdox-html and --testdox-text
Generates agile documentation in HTML or plain text format for the tests that are run.
生成记录已运行测试的html或者纯文本格式的文件文档
--filter
Only runs tests whose name matches the given pattern. The pattern can be either the name of a single test or a regular expression that matches multiple test names.
只运行名字符合参数规定的格式的测试,参数可以是一个测试的名字或者一个匹配多个测试名字的正则表达式
--group
Only runs tests from the specified group(s). A test can be tagged as belonging to a group using the @group annotation.
只运行规定的测试组,一个测试可以使用@group注释来分组
The @author annotation is an alias for @group allowing to filter tests based on their authors.
@author注视是一个和@group关联的注释标签,用来根据作者来过滤测试
--exclude-group
Exclude tests from the specified group(s). A test can be tagged as belonging to a group using the @group annotation.
只包含规定的多个测试组,一个测试可以使用@group注释来分组
--list-groups
List available test groups.
列出可用的测试组
--loader
Specifies the PHPUnit_Runner_TestSuiteLoader implementation to use.
定义使用PHPUnit_Runner_TestSuiteLoader的接口
The standard test suite loader will look for the sourcefile in the current working directory and in each directory that is specified in PHP's include_path configuration directive. Following the PEAR Naming Conventions, a class name such as Project_Package_Class is mapped to the sourcefile name Project/Package/Class.php.
标准的standard test suite loader会在当前的目录和php的include_path中根据PEAR的命名规则的类,一个叫做Project_Package_Class的类 会指向到文件Project/Package/Class.php
--repeat
Repeatedly runs the test(s) the specified number of times.
根据定义的数字重复运行测试
--tap
Reports the test progress using the Test Anything Protocol (TAP).
使用Test Anything Protocol格式报告测试进程
--testdox
Reports the test progress as agile documentation.
使用agile documentation格式报告测试进程
--colors
Use colors in output.
在输出结果中使用颜色
--stderr
Optionally print to STDERR instead of STDOUT.
使用STDERR替代STDOUT输出结果
--stop-on-error
Stop execution upon first error.
在遇到第一个错误时停止执行
--stop-on-failure
Stop execution upon first error or failure.
在遇到第一个失败时停止执行
--stop-on-skipped
Stop execution upon first skipped test.
在遇到第一个跳过的测试时停止执行