qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          單元測(cè)試中的Fluent Interface

           測(cè)試的重要性是每個(gè)程序員都明白的, 但真正自己去做測(cè)試(Unit Test)的卻很少, 曾經(jīng)我也是其中的一員.
            因?yàn)閷憘€(gè)main調(diào)用一些方法, 打印出結(jié)果或狀態(tài), 然后人工肉眼去排查, 若不是迫于無(wú)奈, 我相信沒(méi)有程序員愿意糾結(jié)于這些瑣碎的東西.
            其實(shí), 測(cè)試本可以很有趣的.借助JUnit, 我們可以將測(cè)試按不同的場(chǎng)景組織起來(lái), 在”一鍵”之后的紅綠條的反饋下, 快速解決代碼中存在的問(wèn)題. 如果你還不太了解JUnit, 請(qǐng)先去這里. 后文將以JUnit為基礎(chǔ), 以Fluent Interface(這個(gè)在國(guó)內(nèi)還比較時(shí)髦的術(shù)語(yǔ))為切入點(diǎn), 展示一下更有趣的測(cè)試.
            在解釋什么是Fluent Interface之前, 請(qǐng)先看這樣一段測(cè)試代碼:
          public class Calculator {
          public int sum(int one, int other);
          }
          public class CalculatorTest {
          private final Calculator calc = new Calcuator();
          @Test public void 08 onePlusOne() {
          assertEquals(2, calc.sum(1, 1));
          }
          }
            上述代碼是基于JUnit4編寫的, 用assertEquals來(lái)測(cè)試Calculator的sum方法對(duì)一加一計(jì)算的結(jié)果. 這種寫法很簡(jiǎn)單, 但從語(yǔ)義上并不是那么流暢, 若換種寫法, 如:
          public class CalculatorTest {
          [...]
          @Test public void
          assertThatOnePlusOneIsEqualToTwo() {
          assertThat(calc.sum(1, 1)).isEqualTo(2);
          }
          }
            這樣閱讀起來(lái)是否感到更為清晰呢? 若是將語(yǔ)句中的符號(hào)換成空格:
            assert that calc sum 1 and 1 is equal to 2
            這幾乎就是人類的自然語(yǔ)言了(囧, 盡管是e文).
            也許這個(gè)例子只是讓大家看到易讀性的優(yōu)勢(shì), 那么再看看下面這個(gè)易編寫的例子:
          public interface Querier {
          Collection<String> findNameBy(int age);
          }
          public class OrderQuerier {
          private final Querier querier = [...]
          @Test public void
          findNamesWithAgeInThirty() {
          Collection<String> names = querier.findNameBy(30);
          assertEquals(2, names.size());
          assertTrue(names.contains("allen"));
          assertTrue(names.contains("john"));
          }
          @Test public void
          findNamesWithAgeInThirty() {
          Collection<String> names = querier.findNameBy(30);
          assertThat(names).hasSize(2).contains("allen", "john");
          }
          }
            怎么樣, 上面這個(gè)對(duì)比下, 后者是否能讓你感到”清爽”呢?
            assertThat風(fēng)格的assert正是應(yīng)用了Fluent Interface, 使得測(cè)試的代碼流暢易讀, 編寫簡(jiǎn)單.
            Fluent interface可以看作是借用了Method Chaining來(lái)實(shí)現(xiàn)的一種Internal DSL(Domain-Specific Language), 關(guān)于它這兒有更為全面的介紹.
            前面展示的assertThat僅是FEST-Assert提供一組API的很小一部分, 它還支持其它的:
            Primary Type
            Object
            Array
            Iterator
            Throwable
            File
            Map
            除了FEST-Assert, 其實(shí)還有另一個(gè)在JUnit測(cè)試中被廣泛應(yīng)用的”assertThat”——hamcrest, 它使用靜態(tài)導(dǎo)入加工廠方法實(shí)現(xiàn)的Internal DSL, 同樣很有趣的, 不妨look一下.

          posted on 2014-01-30 12:01 順其自然EVO 閱讀(288) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2014年1月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 和顺县| 岐山县| 浦东新区| 榕江县| 资兴市| 乌拉特中旗| 增城市| 无极县| 新建县| 中卫市| 泰顺县| 台山市| 紫阳县| 阳朔县| 泸西县| 兴宁市| 尤溪县| 青州市| 青岛市| 彰武县| 锡林浩特市| 鄂托克前旗| 庄河市| 丰镇市| 唐山市| 古丈县| 多伦县| 安乡县| 科尔| 东兴市| 津南区| 潮州市| 霍州市| 恩施市| 榆社县| 靖宇县| 白山市| 东阳市| 东源县| 宜州市| 崇左市|