昨天在學習 SplDoublyLinkedList
的時候發現一個有趣的現象,好比php
php$obj = new SplDoublyLinkedList(); $obj->push('string');
這時候想判斷 $obj
裏面到底有沒有值,或是否是一個,而且裏面的值爲 'string',咱們一般會:html
phpprint_r($obj);
而後經過肉眼去看打印出來的,確實與咱們想的一致,那麼咱們就會認爲是成功的。若是不一致就會認爲是失敗的。node
仔細想一想,這種與咱們要作的測試程序不是如出一轍嘛,只不過測試程序是用來檢測咱們的代碼有沒有問題,但如今因爲代碼是 PHP 官網這種權威組織寫的,咱們能夠認爲都是對的,如今要是寫測試程序的話,就是另外一層函義了,不是測試他們的代碼是否有問題,而是表明咱們對這個功能的認識。函數
常常咱們會用 print_r
來打印,有時候本身會主觀的認爲是這樣是那樣,而後看的也不必定很仔細,而後就認爲是對的,最後實際使用時發現不是的想的那樣(我有親身經歷),寫測試就是讓程序來判斷,咱們的想法是否是有問題,哪裏出錯了,最主要它還能夠把當時的思路保持下來,之後再繼續回顧。學習
如下是我在學習 SplDoublyLinkedList
時寫的一些測試,之後看到這個測試類,就知道了 SplDoublyLinkedList
該怎麼用了。測試
php<?php class SplDoublyLinkedListTest extends PHPUnit_Framework_TestCase { public function testSplDoublyLinkedListPart1() { $obj = new SplDoublyLinkedList(); // Pushes value at the end of the doubly linked list. $obj->push(0); $obj->push(1); $obj->push(2); // Prepends value at the beginning of the doubly linked list. $obj->unshift(10); $obj->unshift(11); /* * 由於指針還未初始化 * 因此 * 1. 當前指針是否有效爲 FALSE * 2. 直接獲取當前指針的值會是 NULL */ $this->assertEquals(FALSE, $obj->valid()); $this->assertEquals(NULL, $obj->current()); $obj->rewind(); // 將指針重置以後,第一個確定是 11 ,由於它是在最後執行了一個 // 將 11 插入到鏈表最前面的一個函數 unshift $this->assertEquals(11, $obj->current()); $obj->next(); // 11 下面應該是 10 $this->assertEquals(10, $obj->current()); // (下一個 下一個 上一個) === (下一個) $obj->next(); // 0 $obj->next(); // 1 $obj->prev(); // 0 $this->assertEquals(0, $obj->current()); $obj->next(); // 1 $obj->next(); // 2 $obj->next(); // 已經超過最大的了,使用 valid 判斷應該是 false $this->assertEquals(false, $obj->valid()); } public function testSplDoublyLinkedListPart2() { $obj = new SplDoublyLinkedList(); // Pushes value at the end of the doubly linked list. $obj->push(0); $obj->push(1); $obj->push(2); // Prepends value at the beginning of the doubly linked list. $obj->unshift(10); $obj->unshift(11); // Peeks at the node from the end of the doubly linked list // Return: The value of the last node. // 獲取最後一個節點的值 $this->assertEquals(2, $obj->top()); // Peeks at the node from the beginning of the doubly linked list // Return: The value of the first node. // 獲取第一個節點的值 $this->assertEquals(11, $obj->bottom()); } public function testIsEmpty(){ $obj = new SplDoublyLinkedList(); $this->assertEquals(true, $obj->isEmpty()); $obj->unshift('string'); // 這裏已經有值了就應該是 false $this->assertEquals(false, $obj->isEmpty()); // 這時再使用 pop 彈出最後一個就應該是 'string' $this->assertEquals('string', $obj->pop()); } /** * 若是是空的時候試圖 pop 彈出最後一個節點的值則會 拋出一個 RuntimeException * * @expectedException RuntimeException */ public function testRuntimeException(){ $obj = new SplDoublyLinkedList(); $obj->pop(); } public function testOffset(){ $obj = new SplDoublyLinkedList(); $obj->push('one'); $obj->push('two'); $obj->unshift('three'); // 下標是從0 開始的 因此如今3 應該是不存在的 $this->assertEquals(false, $obj->offsetExists(3)); // 下標爲2 的應該是存在的 $this->assertEquals(true, $obj->offsetExists(2)); $this->assertEquals('two', $obj->offsetGet(2)); // 刪除下標爲0 的值 $obj->offsetUnset(0); // 刪除爲 0 的值以後,後面的都會向前移一位 // 因此如今的順序爲: one two $obj->rewind(); $this->assertEquals('one', $obj->current()); $this->assertEquals(0, $obj->key()); $obj->next(); $this->assertEquals('two', $obj->current()); $this->assertEquals(1, $obj->key()); // 而且總個數爲 2 $this->assertEquals(2, $obj->count()); } public function testAdd(){ $obj = new SplDoublyLinkedList(); $obj->push('one'); $obj->push('two'); $obj->push('three'); $obj->unshift('four'); $obj->add(1, 'five'); // 這時候的順序應該是: // four five one two three $obj->rewind(); $this->assertEquals('four', $obj->current()); $obj->next(); $this->assertEquals('five', $obj->current()); $obj->next(); $this->assertEquals('one', $obj->current()); $obj->next(); $this->assertEquals('two', $obj->current()); $obj->next(); $this->assertEquals('three', $obj->current()); } }
原文連接 學習 PHP 程序新東西的另外一種方法this