{ programming }

  • Enable HTTPBuilder debug message

    | /

    在用 groovy & cucumber 寫 API test 時,如果發生問題只會噴個 error 的 body 而已,這樣非常難 debug 。

    而且有一些參數是設在 http header 上,如果把每個 API 的 header 都印出來,要到處塞 debug logger。如果是 https 的話,也沒辦法使用 tcpdump 來看。
    這時可以用下列方法簡單的把 logger 設定打開,就可以直接噴在營幕上了,這樣比較好 debug。

    1
    $ mvn -B integration-test -Dcucumber.options="--tags @test_only" \ -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog \ -Dorg.apache.commons.logging.simplelog.showdatetime=true \ -Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG

    還有其他的參數可以參考後附的文章內容。

    reference

  • [php] mock 有 reference parameter 的 method

    | /

    前言

    雖然盡量不要在 php 裡面寫 call by reference 的參數,但是有一些舊有的code 還是有人這樣寫。如果這時又想要mock 他就麻煩了,因為值並不會隨著自已想要的內容作改變。

    實作

    原先的 class 設計如下

    [code lang=”php”] <?php class NeedToMockClass { function testReference(&$str) { // 也許會有很多很複雜的計算,不過這邊簡化成一行就好 $str = “test String”; return; } } class testClass{ function test($str) { $t = new NeedToMockClass(); $t->testReference($str); return __METHOD__ .’->’ . $str; } } // $t = new testClass(); // $str = $t->test(‘not a test string’); // var_dump($str); // string(28) “testClass::test->test String” [/code]

    How To Test?

    如果這時我要測 testClass 我該如何測?因為我單純的只想測 testClass 裡的邏輯對不對,我不想管 NeedToMockClass 的邏輯,所以這時我該把 class mock 掉,並且讓他可以自定 $str 的 output。 首先,會先改寫 testClass 讓他可以從外面傳 NeedToMockClass 的 object 進去。 [code lang=”php”] <?php class testClass{ private $_mockClass = null; // 由 construct 傳進來,讓他可以取代掉預設的 mockClass function __construct($mockClass == null) { if ($mockClass = null) { $mockClass = new NeedToMockClass(); } $this->_mockClass = $mockClass; } function test($str) { // 接著用mock 後的class 來執行 $this->_mockClass->testReference($str); return __METHOD__ .’->’ . $str; } } [/code] 最後測試程式會用下面這個方法寫,主要是用 returnCallback 的方式來 mock: [code lang=”php”] <?php require_once ‘./sample.php’; class testTest extends PHPUnit_Framework_TestCase { function mockTestReference(&$str) { $str = ‘3345678’; } function testTestClass() { $mockClass = $this->getMock(‘NeedToMockClass’, array(), array(), “” ,false); // 這裡是用 returnCallback 的方式呼叫 testTest::mockTestReference 這樣就可以改 $str 的內容了 $mockClass->expects($this->any()) ->method(‘testReference’) ->will($this->returnCallback(array(‘testTest’, ‘mockTestReference’))); $t = new testClass($mockClass); $str = ‘one test’; $ret = $t->test($str); // 最後會如預期的產生 testClass::test->3345678 的字樣 $this->assertEquals(‘testClass::test->3345678’, $ret); } } [/code] 順利達成目標,其結果如下: [code lang=”bash”] $ phpunit testTest.php PHPUnit 3.7.35 by Sebastian Bergmann. . Time: 22 ms, Memory: 3.50Mb OK (1 test, 2 assertions) [/code]

    參考文件

  • 在 Console 底下簡單的 Yaml syntax check Script

    | /

    介紹

    在編寫 yaml 檔時,如果沒有使用任何的 IDE, 或是想 automation 作檢查,勢必需要在 CLI 可以檢查的方法。Yaml 檔發生錯誤是很擾人的,尤其是一個yaml 檔可能上百行,要找一個空白空錯沒有什麼好方法。最近就遇到因為前一版 commit 設定檔的人沒有檢查語法,設定檔裡面少了一個空白,結果造成 indent 就不對,接著程式沒寫好就直接停止執行的問題。但後來想想,應該要有一些方便的 tool 在編寫 yaml 檔結束後,作一些簡單的檢查,來減少浪費大家人力來追問題。

    實作方法

    • 安裝 ruby
    • 安裝 awesome_print 的 gem 檔

      # sudo gem install awesome_print

    • 執行 ruby 指令

      $ ruby -e “require ‘yaml’; require ‘awesome_print’; y=YAML.load_file(‘/tmp/example.yaml’); ap y”

    在 MAC 下只要安裝一個 gem 檔,然後用內建的 ruby 指令馬上就可以看出來了,而且畫面還非常的漂亮。

    DEMO

    我們以 wikipedia 上的 yaml 範例檔為例:

    --- receipt: Oz-Ware Purchase Invoice date: 2012-08-06 customer: given: Dorothy family: Gale items: - part_no: A4786 descrip: Water Bucket (Filled) price: 1.47 quantity: 4 - part_no: E1628 descrip: High Heeled “Ruby” Slippers size: 8 price: 100.27 quantity: 1 bill-to: &id001 street: | 123 Tornado Alley Suite 16 city: East Centerville state: FL ship-to: *id001 specialDelivery: > Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain.

    Result: 如果一切順利的話,可以看到下面的結果,除了可以驗證內容打的對不對之外,還可以看結構是否正確。 yaml parse result 如果結構有錯,或是語法有錯,他會顯示錯誤的行數,這樣就比較好 Debug 了。 parse error

    結論

    如果有 vim 的 plugin or sublime 的 plugin 在即時編寫時,就可以直接列出語法有問題的地方應該會更好更直覺。不過現在這個方法比較適合在 CI commit build 預先作檢查,減少錯誤的程式上到 production 。

    參考

    [1] http://stackoverflow.com/questions/3971822/yaml-syntax-validator [2] http://stackoverflow.com/questions/17289399/how-do-i-pretty-print-a-hash-to-a-rails-view [3] https://github.com/michaeldv/awesome_print