最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA中單元測試的常用方式(小結(jié))

 更新時(shí)間:2019年06月24日 09:51:55   作者:空無  
這篇文章主要介紹了JAVA中單元測試的常用方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

什么是單元測試

單元測試(英語:Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設(shè)計(jì)的最小單位)來進(jìn)行正確性檢驗(yàn)的測試工作。程序單元是應(yīng)用的最小可測試部件。在過程化編程中,一個(gè)單元就是單個(gè)程序、函數(shù)、過程等;對于面向?qū)ο缶幊?,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法?br />

通常來說,程序員每修改一次程序就會(huì)進(jìn)行最少一次單元測試,在編寫程序的過程中前后很可能要進(jìn)行多次單元測試,以證實(shí)程序達(dá)到軟件規(guī)格書要求的工作目標(biāo),沒有程序錯(cuò)誤;雖然單元測試不是什么必須的,但也不壞,這牽涉到項(xiàng)目管理的政策決定。

單元測試的優(yōu)點(diǎn)

優(yōu)質(zhì)的單元測試可以保障開發(fā)質(zhì)量和程序的魯棒性。在大多數(shù)互聯(lián)網(wǎng)企業(yè)中開發(fā)工程師在研發(fā)過程中都會(huì)頻繁地執(zhí)行測試用例,運(yùn)行失敗的單測能幫助我們快速排查和定位問題 使問題在被帶到線上之前完成修復(fù)。正如軟件工程界的一條金科玉律----越早發(fā)現(xiàn)的缺陷,其修復(fù)成本越低。一流的測試能發(fā)現(xiàn)未發(fā)生的故障;二流的測試能快速定位故障的發(fā)生點(diǎn);三流的測試則疲于奔命,一直跟在故障后面進(jìn)行功能回歸。
JAVA中常用的單元測試工具

JUnit/JUnit5

https://junit.org/junit5/

junit是老牌測試框架了,也是目前引用最廣泛的一個(gè)框架。當(dāng)前已經(jīng)更新到Junit5,功能更強(qiáng)大。

class StandardTests {

  @BeforeAll
  static void initAll() {
  }

  @BeforeEach
  void init() {
  }

  @Test
  void succeedingTest() {
  }

  @Test
  void failingTest() {
    fail("a failing test");
  }

  @Test
  @Disabled("for demonstration purposes")
  void skippedTest() {
    // not executed
  }

  @Test
  void abortedTest() {
    assumeTrue("abc".contains("Z"));
    fail("test should have been aborted");
  }

  @AfterEach
  void tearDown() {
  }

  @AfterAll
  static void tearDownAll() {
  }

}

assertj

https://assertj.github.io/doc/

一個(gè)功能強(qiáng)悍的斷言工具,支持各種斷言方式

// entry point for all assertThat methods and utility methods (e.g. entry)
import static org.assertj.core.api.Assertions.*;

// basic assertions
assertThat(frodo.getName()).isEqualTo("Frodo");
assertThat(frodo).isNotEqualTo(sauron);

// chaining string specific assertions
assertThat(frodo.getName()).startsWith("Fro")
              .endsWith("do")
              .isEqualToIgnoringCase("frodo");

// collection specific assertions (there are plenty more)
// in the examples below fellowshipOfTheRing is a List<TolkienCharacter>
assertThat(fellowshipOfTheRing).hasSize(9)
                .contains(frodo, sam)
                .doesNotContain(sauron);

// as() is used to describe the test and will be shown before the error message
assertThat(frodo.getAge()).as("check %s's age", frodo.getName()).isEqualTo(33);

// Java 8 exception assertion, standard style ...
assertThatThrownBy(() -> { throw new Exception("boom!"); }).hasMessage("boom!");
// ... or BDD style
Throwable thrown = catchThrowable(() -> { throw new Exception("boom!"); });
assertThat(thrown).hasMessageContaining("boom");

// using the 'extracting' feature to check fellowshipOfTheRing character's names (Java 7)
assertThat(fellowshipOfTheRing).extracting("name")
                .contains("Boromir", "Gandalf", "Frodo", "Legolas")
// same thing using a Java 8 method reference
assertThat(fellowshipOfTheRing).extracting(TolkienCharacter::getName)
                .doesNotContain("Sauron", "Elrond");

// extracting multiple values at once grouped in tuples (Java 7)
assertThat(fellowshipOfTheRing).extracting("name", "age", "race.name")
                .contains(tuple("Boromir", 37, "Man"),
                     tuple("Sam", 38, "Hobbit"),
                     tuple("Legolas", 1000, "Elf"));

// filtering a collection before asserting in Java 7 ... 
assertThat(fellowshipOfTheRing).filteredOn("race", HOBBIT)
                .containsOnly(sam, frodo, pippin, merry);
// ... or in Java 8
assertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o"))
                .containsOnly(aragorn, frodo, legolas, boromir);

// combining filtering and extraction (yes we can)
assertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o"))
                .containsOnly(aragorn, frodo, legolas, boromir)
                .extracting(character -> character.getRace().getName())
                .contains("Hobbit", "Elf", "Man");

// and many more assertions: iterable, stream, array, map, dates (java 7 and 8), path, file, numbers, predicate, optional ...

Mockito

https://site.mockito.org/

一個(gè)單元測試中的Mock工具,可以很靈活的創(chuàng)建對象,配合單元測試。

// You can mock concrete classes and interfaces
TrainSeats seats = mock(TrainSeats.class);

// stubbing appears before the actual execution
when(seats.book(Seat.near(WINDOW).in(FIRST_CLASS))).thenReturn(BOOKED);

// the following prints "BOOKED"
System.out.println(seats.book(Seat.near(WINDOW).in(FIRST_CLASS)));

// the following prints "null" because 
// .book(Seat.near(AISLE).in(FIRST_CLASS))) was not stubbed
System.out.println(seats.book(Seat.near(AISLE).in(FIRST_CLASS)));

// the following verification passes because 
// .book(Seat.near(WINDOW).in(FIRST_CLASS)) has been invoked
verify(seats).book(Seat.near(WINDOW).in(FIRST_CLASS));

// the following verification fails because 
// .book(Seat.in(SECOND_CLASS)) has not been invoked
verify(seats).book(Seat.in(SECOND_CLASS));

其他

對于業(yè)務(wù)代碼,有時(shí)單元測試并不方便,因?yàn)槊看螁?dòng)成本過高。可以使用適當(dāng)?shù)膯卧獪y試方式,比如可以提供一個(gè)測試接口,利用IDE的熱部署功能實(shí)現(xiàn)不重啟及時(shí)修改代碼。

但是對于非業(yè)務(wù)性代碼,進(jìn)行單元測試時(shí)非常有必要的,可以更早的發(fā)現(xiàn)代碼中的問題,同時(shí)也可以檢驗(yàn)程序的解耦性。

良好的代碼設(shè)計(jì)在單元測試時(shí)會(huì)更方便,反之緊耦合的設(shè)計(jì)會(huì)給單元測試帶來很大的困擾。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中的值傳遞和引用傳遞的區(qū)別分析

    java中的值傳遞和引用傳遞的區(qū)別分析

    本文介紹了“java中的值傳遞和引用傳遞的區(qū)別分析”,需要的朋友可以參考一下
    2013-03-03
  • 使用Spring源碼報(bào)錯(cuò)java:找不到類 InstrumentationSavingAgent的問題

    使用Spring源碼報(bào)錯(cuò)java:找不到類 InstrumentationSavingAgent的問題

    這篇文章主要介紹了使用Spring源碼報(bào)錯(cuò)java:找不到類 InstrumentationSavingAgent的問題,本文給大家分享解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 詳解Maven多模塊打包遇到的問題解決方法

    詳解Maven多模塊打包遇到的問題解決方法

    這篇文章主要介紹了詳解Maven多模塊打包遇到的問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring事務(wù)管理零基礎(chǔ)入門

    Spring事務(wù)管理零基礎(chǔ)入門

    事務(wù)的作用就是為了保證用戶的每一個(gè)操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就?回退到事務(wù)開始未進(jìn)行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們在使用Spring?Boot開發(fā)應(yīng)用時(shí),大部分情況下也都需要使用事務(wù)
    2022-10-10
  • nacos配置實(shí)例權(quán)重不生效問題

    nacos配置實(shí)例權(quán)重不生效問題

    這篇文章主要介紹了nacos配置實(shí)例權(quán)重不生效問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java實(shí)現(xiàn)簡單雙色球搖獎(jiǎng)功能過程解析

    Java實(shí)現(xiàn)簡單雙色球搖獎(jiǎng)功能過程解析

    這篇文章主要介紹了Java實(shí)現(xiàn)簡單雙色球搖獎(jiǎng)功能過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java基礎(chǔ)知識(shí)精通循環(huán)結(jié)構(gòu)與break及continue

    Java基礎(chǔ)知識(shí)精通循環(huán)結(jié)構(gòu)與break及continue

    循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個(gè)功能而設(shè)置的一種程序結(jié)構(gòu)。它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個(gè)功能還是退出循環(huán),選擇結(jié)構(gòu)用于判斷給定的條件,根據(jù)判斷的結(jié)果判斷某些條件,根據(jù)判斷的結(jié)果來控制程序的流程
    2022-04-04
  • SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決

    SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決

    這篇文章主要介紹了SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 淺談JVM系列之從匯編角度分析NullCheck

    淺談JVM系列之從匯編角度分析NullCheck

    在virtual call中執(zhí)行nullcheck的時(shí)候,如果已經(jīng)知道傳遞的參數(shù)是非空的。JIT會(huì)對代碼進(jìn)行優(yōu)化嗎?本文將詳細(xì)介紹JVM系列之從匯編角度分析NullCheck。
    2021-06-06
  • Mybatis一對多查詢的兩種姿勢(值得收藏)

    Mybatis一對多查詢的兩種姿勢(值得收藏)

    這篇文章主要給大家介紹了關(guān)于Mybatis一對多查詢的兩種姿勢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評論

徐闻县| 丰镇市| 普格县| 深水埗区| 读书| 阳曲县| 青川县| 隆昌县| 乌恰县| 定州市| 隆尧县| 定远县| 巴塘县| 张北县| 岱山县| 盐津县| 五河县| 遵义县| 安陆市| 永川市| 阳新县| 兴山县| 岱山县| 南投市| 会宁县| 清水河县| 旬阳县| 长春市| 玉门市| 南漳县| 澜沧| 青河县| 高碑店市| 久治县| 五大连池市| 桐柏县| 伊宁县| 湘乡市| 凉山| 新田县| 同德县|