亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

對于PHPUnit測試私有屬性和方法的功能分析

2020-03-22 20:31:51
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHPUnit測試私有屬性和方法功能,結合實例形式較為詳細的分析了使用PHPUnit針對私有屬性和方法進行測試的相關操作技巧與注意事項,需要的朋友可以參考下

本文實例講述了PHPUnit測試私有屬性和方法功能。分享給大家供大家參考,具體如下:

一、測試類中的私有方法:

html' target='_blank'>class Sample private $a = 0; private function run() echo $a;}

上面只是簡單的寫了一個類包含,一個私有變量和一個私有方法。對于protected和private方法,由于無法像是用public方法一樣直接調用,所以在使用phpunit進行單測的時候,多有不便,特別是當一個類中,對外只提供少量接口,內部使用了大量private方法的情況。

對于protected方法,建議使用繼承的方式進行測試,在此就不再贅述。而對于private方法的測試,建議使用php的反射機制來進行。話不多說,上代碼:

class testSample() $method = new ReflectionMethod( Sample , run  $method- setAccessible(true); //將run方法從private變成類似于public的權限 $method- invoke(new Sample()); //調用run方法}

如果run方法是靜態的,如:

private static function run() echo run is a private static function }

那么invoke函數還可以這么寫:

$method- invoke(null); //只有靜態方法可以不必傳類的實例化

如果run還需要傳參,比如:

private function run($x, $y) return $x + $y;}

那么,測試代碼可以改為:

$method- invokeArgs(new Sample(), array(1, 2));//array中依次寫入要傳的參數。執行結果返回3

【注意】:利用反射的方法測試私有方法雖好,但setAccessible函數是php5.3.2版本以后才支持的( =5.3.2)

二、私有屬性的get/set

說完了私有方法,再來看看私有屬性,依舊拿Sample類作為例子,想要獲取或設置Sample類中的私有屬性$a的值可以用如下方法:

public function testPrivateProperty() $reflectedClass = new ReflectionClass( Sample  $reflectedProperty = $reflectedClass- getProperty( a  $reflectedProperty- setAccessible(true); $reflectedProperty- getValue(); //獲取$a的值 $reflectedProperty- setValue(123); //給$a賦值:$a = 123;}

上述方法對靜態屬性依然有效。

到此,是不是瞬間感覺測試私有方法或屬性變得很容易了。

附:PHPunit 測試私有方法(英文原文)

This article is part of a series on testing untestable code:

Testing private methods

Testing code that uses singletons

Stubbing static methods

Stubbing hard-coded dependencies

No, not those privates. If you need help with those, this book might help.

One question I get over and over again when talking about Unit Testing is this:

How do I test the private attributes and methods of my objects?

Lets assume we have a class Foo:

 ?phpclass Foo private $bar = baz  public function doSomething() return $this- bar = $this- doSomethingPrivate(); private function doSomethingPrivate() return blah ? 

Before we explore how protected and private attributes and methods can be tested directly, lets have a look at how they can be tested indirectly.

The following test calls the testDoSomething() method which in turn calls thedoSomethingPrivate() method:

 ?phpclass FooTest extends PHPUnit_Framework_TestCase * @covers Foo::doSomething * @covers Foo::doSomethingPrivate public function testDoSomething() $foo = new Foo; $this- assertEquals( blah , $foo- doSomething());? 

The test above assumes that testDoSomething() only works correctly whentestDoSomethingPrivate() works correctly. This means that we have indirectly testedtestDoSomethingPrivate(). The problem with this approach is that when the test fails we do not know directly where the root cause for the failure is. It could be in eithertestDoSomething() or testDoSomethingPrivate(). This makes the test less valuable.

PHPUnit supports reading protected and private attributes through thePHPUnit_Framework_Assert::readAttribute() method. Convenience wrappers such asPHPUnit_Framework_TestCase::assertAttributeEquals() exist to express assertions onprotected and private attributes:

 ?phpclass FooTest extends PHPUnit_Framework_TestCase public function testPrivateAttribute() $this- assertAttributeEquals( baz , /* expected value */ bar , /* attribute name */ new Foo /* object */? 

PHP 5.3.2 introduces the ReflectionMethod::setAccessible() method to allow the invocation of protected and private methods through the Reflection API:

 ?phpclass FooTest extends PHPUnit_Framework_TestCase * @covers Foo::doSomethingPrivate public function testPrivateMethod() $method = new ReflectionMethod( Foo , doSomethingPrivate  $method- setAccessible(TRUE); $this- assertEquals( blah , $method- invoke(new Foo)? 

In the test above we directly test testDoSomethingPrivate(). When it fails we immediately know where to look for the root cause.

I agree with Dave Thomas and Andy Hunt, who write in their book Pragmatic Unit Testing :

In general, you don t want to break any encapsulation for the sake of testing (or as Mom used to say, don t expose your privates! ). Most of the time, you should be able to test a class by exercising its public methods. If there is significant functionality that is hidden behind private or protected access, that might be a warning sign that there s another class in there struggling to get out.

So: Just because the testing of protected and private attributes and methods is possible does not mean that this is a good thing .

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

PHP和redis實現悲觀鎖機制的解析

php中可變函數的使用總結

以上就是對于PHPUnit測試私有屬性和方法的功能分析的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品稀缺呦系列在线| 国产高清在线不卡| 国产999在线观看| 久久天天躁狠狠躁老女人| 日韩电影大片中文字幕| 午夜免费久久久久| 亚洲最大福利网| 亚洲视频专区在线| 亚洲视频电影图片偷拍一区| 欧美一级电影久久| 国产成人综合精品在线| 永久免费毛片在线播放不卡| 亚洲va久久久噜噜噜久久天堂| 国产精品久久久久久久久久尿| 国产精品无av码在线观看| 精品色蜜蜜精品视频在线观看| 国产中文欧美精品| 国产精品亚洲美女av网站| 亚洲激情视频网站| 国产一区二区三区丝袜| 美女999久久久精品视频| 性欧美xxxx| 久久91亚洲精品中文字幕奶水| 国产成人精品免费久久久久| 色综合天天狠天天透天天伊人| 成人国产亚洲精品a区天堂华泰| 国产日韩精品在线观看| 日韩精品视频中文在线观看| 国产亚洲激情在线| 亚洲自拍小视频免费观看| 欧美在线观看一区二区三区| 亚洲国产精品国自产拍av秋霞| 亚洲精品日韩激情在线电影| 中文字幕日韩在线观看| 精品久久久久久久久久久久久久| 亚洲一区二区三区香蕉| 69av在线视频| 欧美日本在线视频中文字字幕| 久久久久成人网| 在线观看国产精品日韩av| 欧美激情一级精品国产| 91视频国产高清| 91精品国产综合久久香蕉最新版| 久久国产精品久久国产精品| 亚洲国产一区二区三区在线观看| 日韩中文字幕免费看| 国模吧一区二区| 欧美激情国产日韩精品一区18| 久久中文字幕视频| 亚洲大胆人体av| 久久久久久久久久久网站| 日本电影亚洲天堂| 都市激情亚洲色图| 亚洲欧美在线一区二区| 日韩精品视频三区| 国产成人精品视频在线观看| 日韩一区av在线| 青青草原一区二区| 国产精品美女久久久久久免费| 亚洲视频综合网| 性夜试看影院91社区| 国产精品久久久久久久9999| 亚洲国产成人一区| 午夜精品www| 中文字幕在线成人| 51精品在线观看| 日韩免费观看在线观看| 992tv成人免费影院| www.久久撸.com| 成人午夜在线观看| 日本欧美爱爱爱| 精品国产一区二区三区久久狼5月| 国产精品大片wwwwww| 亚洲区免费影片| 俺去啦;欧美日韩| 亚洲xxxxx电影| 91性高湖久久久久久久久_久久99| 亚洲精品在线看| 国产精品自拍小视频| 美日韩精品免费视频| 91精品视频在线免费观看| 欧美精品激情在线观看| 一区二区亚洲精品国产| 亚洲精美色品网站| 国产精品羞羞答答| 欧美xxxx做受欧美| 国产精品久久久久久久久久久久| 高清在线视频日韩欧美| 国产亚洲欧洲在线| 欧美国产激情18| 热久久99这里有精品| 久久国产精品影片| 精品成人乱色一区二区| 国产精品免费一区| 国产成人精品久久二区二区91| 欧美在线性爱视频| 亚洲人成网站色ww在线| 国产精品7m视频| 日韩精品视频免费| 亚洲理论电影网| 国产啪精品视频| 色播久久人人爽人人爽人人片视av| 欧美精品第一页在线播放| 热门国产精品亚洲第一区在线| 亚洲大胆人体在线| 色伦专区97中文字幕| 91麻豆国产精品| 欧美视频在线免费| 国产精品99久久99久久久二8| 久久久精品一区| 欧洲永久精品大片ww免费漫画| 色偷偷91综合久久噜噜| 久久九九全国免费精品观看| 亚洲bt欧美bt日本bt| 国产精品久久久久久久久粉嫩av| 国产一区二区三区视频在线观看| 欧美视频在线视频| 亚洲第一区第二区| 精品女厕一区二区三区| 久久99久国产精品黄毛片入口| 亚洲视频在线观看免费| 国产一区二中文字幕在线看| 日韩中文字幕在线播放| 欧美做受高潮电影o| 亚洲欧美在线磁力| 亚洲国产成人久久| 欧美国产在线视频| 欧美一级片免费在线| 亚洲免费精彩视频| 国产91色在线|| 欧美午夜无遮挡| 亚洲电影免费观看高清完整版在线观看| 国产69精品99久久久久久宅男| 97视频在线观看免费高清完整版在线观看| 欧美视频免费在线观看| 日韩av综合中文字幕| 日韩欧美在线视频| 国内精品久久久久久| 69久久夜色精品国产69| 88国产精品欧美一区二区三区| 国产亚洲欧美另类中文| 最近中文字幕mv在线一区二区三区四区| 久久久精品在线| 热99久久精品| 国产精品444| 日韩成人中文字幕在线观看| 伊人成人开心激情综合网| 国内免费久久久久久久久久久| 欧美超级免费视 在线| 日韩久久精品成人| 91精品综合久久久久久五月天| 亚洲最大的网站| 在线午夜精品自拍| 久久不射电影网| 久久精品国产一区二区电影| 成人午夜激情网| 国产精品九九久久久久久久| 国产97在线|日韩| 成人欧美在线视频| 成人h片在线播放免费网站| 97视频在线观看免费高清完整版在线观看| 日韩av观看网址| 欧美日韩中文字幕在线| 中文字幕欧美日韩va免费视频|