<ruby id="h6500"><table id="h6500"></table></ruby>
    1. <ruby id="h6500"><video id="h6500"></video></ruby>
          1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>

            你真的會(huì )寫(xiě) 單元測試嗎?TDD初體驗

            發(fā)表于:2019-11-18來(lái)源:cnblogs作者:李佳霖i點(diǎn)擊數: 標簽:
            昨天讀到了一篇文章,講的是TDD,即Test-Driven Development,測試驅動(dòng)開(kāi)發(fā)。大體意思是,它要求在編寫(xiě)某個(gè)功能的代碼之前先編寫(xiě)測試代碼,然后只編寫(xiě)使測試通過(guò)的功能代碼,通過(guò)測試
            前言:
              昨天讀到了一篇文章,講的是TDD,即Test-Driven Development,測試驅動(dòng)開(kāi)發(fā)。大體意思是,它要求在編寫(xiě)某個(gè)功能的代碼之前先編寫(xiě)測試代碼,然后只編寫(xiě)使測試通過(guò)的功能代碼,通過(guò)測試來(lái)推動(dòng)整個(gè)開(kāi)發(fā)的進(jìn)行。這有助于編寫(xiě)簡(jiǎn)潔可用和高質(zhì)量的代碼,并加速開(kāi)發(fā)過(guò)程。
              初讀之時(shí),瞬間感受到了震撼,感覺(jué)和自己之前的開(kāi)發(fā)流程全都不一樣,之前是由始至終,而這種思想確實(shí)以終為始。后來(lái)一查這種思想早在前幾年甚至前幾十年就被提出了,進(jìn)而被廣泛運用到了敏捷開(kāi)發(fā)中??磥?lái)是自己孤落寡聞了,于是我準備將這種思想用到今后的開(kāi)發(fā)中,要做的第一件事,就是溫習如何寫(xiě)用例。
            為什么是溫習?
              早在實(shí)習的時(shí)候,我們研發(fā)組就有寫(xiě)用例的習慣,但是隨著(zhù)開(kāi)發(fā)逐漸熟悉,這種習慣不知不覺(jué)就被丟棄了,有頁(yè)面的點(diǎn)點(diǎn)點(diǎn),沒(méi)頁(yè)面的看邏輯。相信有很多人也像我一樣,不知不覺(jué)就把這項技能丟棄了,接下來(lái)就讓我們一起,去重新?lián)炱疬@項技能。
            工具選擇
            Junit
            對于一個(gè)Java開(kāi)發(fā)工程師來(lái)說(shuō),一提到寫(xiě)單測,我們最先想到的,一定是Junit。下面是maven坐標
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>



            用Junit我們可以快速的,簡(jiǎn)潔的用注解進(jìn)行單元測試。
            @RunWith(SpringJUnit4ClassRunner.class)
            @ContextConfiguration(locations = "classpath:conf/core/*.xml")
            public class ObjTest {

              @Test
              public void testFunc(){
                 //todo test         
              }
            }



            這里要注意的是@ContextConfiguration注解中的路徑是Spring配置文件的位置。測試的方法必須是public的,且沒(méi)有返回值。
            mockito
            mockito是一個(gè)用于模擬對象的工具,我認為他也是測試工作中必不可少的一部分,詳細的介紹我推薦可以看一下:
            人生苦短,我用Mockito https://zhuanlan.zhihu.com/p/59275373
            比較不錯的入門(mén)案例,它的maven坐標地址為:
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
                <version>1.9.5</version>
                <scope>test</scope>
            </dependency>



            Mock這種測試方法, 對比傳統的Junit測試,有如下好處:
            不用每次測試的是時(shí)候,都初始化Spring容器,采用Mock的方式模擬對象,效率高
            對象間的依賴(lài)關(guān)系,可以用Mock去表達,同時(shí),我們不關(guān)心的部分,我們都可以用Mock的方式代替(比如對象A引用對象B的某某方法,但是我們不關(guān)系對象B方法實(shí)現,只想借助方法,這個(gè)時(shí)候就可以Mock)
            可以應對復雜的測試環(huán)境,比如方法調用順序、方法調用次數等等。
            以下是Mock的一個(gè)小案例:
            @RunWith(MockitoJUnitRunner.class)
            public class MockitoTest {
                /**
                 * mock對象
                 */
                @Mock
                List<String> mockedList;

                @Before
                public void setUp() {
                    MockitoAnnotations.initMocks(this);
                }

                @Test
                public void testMock() {
                    // mock對象行為
                    Mockito.when(mockedList.get(0)).thenReturn("one");
                    Assert.assertEquals("one", mockedList.get(0));
                    // 僅僅是mock了對象的行為,實(shí)際上列表還是空的
                    Assert.assertEquals(0, mockedList.size());

                    //驗證mock對象的get方法被調用過(guò),且調用時(shí)的參數是0
                    Mockito.verify(mockedList).get(0);
                }
            }

            這里在使用@Mock的時(shí)候,必須事先調用MockitoAnnotations.initMocks(this),且使用@RunWith(MockitoJUnitRunner.class)
            Jacoco
            JaCoCo是一個(gè)開(kāi)源的覆蓋率工具,支持多種覆蓋率的統計,其中包括:
            行覆蓋率:度量被測程序的每行代碼是否被執行,判斷標準行中是否至少有一個(gè)指令被執行。

            原文轉自:https://www.cnblogs.com/nedulee/p/11863605.html

            ...
            老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
              <ruby id="h6500"><table id="h6500"></table></ruby>
              1. <ruby id="h6500"><video id="h6500"></video></ruby>
                    1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>