国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Springboot Unit Test(單元測試)

這篇具有很好參考價(jià)值的文章主要介紹了Springboot Unit Test(單元測試)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

基本原則

單元測試,是指對程序中的最小可測試單元進(jìn)行驗(yàn)證,在Java中的話,就是類。其有兩個(gè)目的:

  • 驗(yàn)證程序?qū)崿F(xiàn)的邏輯是否與設(shè)計(jì)的邏輯正確
  • 在涉及到代碼修改時(shí),用單元測試去保證原有功能不被破壞,

而一個(gè)好的單元測試應(yīng)該具備以下FIRST 原則和AIR原則中的任何一條:

  • 單元測試的FIRST 規(guī)則
    • Fast 快速原則,測試的速度要比較快,
    • Independent 獨(dú)立原則,每個(gè)測試用例應(yīng)該互不影響,不依賴于外部資源。
    • Repeatable 可重復(fù)原則,同一個(gè)測試用例多次運(yùn)行的結(jié)果應(yīng)該是相同的
    • Self-validating 自我驗(yàn)證原則,單元測試可以自動(dòng)驗(yàn)證,并不需要手工干預(yù)
    • Thorough 及時(shí)原則 單元測試必須即使進(jìn)行編寫,更新,維護(hù)。保證測試用例隨著業(yè)務(wù)動(dòng)態(tài)變化
  • AIR原則
    • Automatic 自動(dòng)化原則 單元測試應(yīng)該是自動(dòng)運(yùn)行,自動(dòng)校驗(yàn),自動(dòng)給出結(jié)果。
    • Independent 獨(dú)立原則 單元測試應(yīng)該獨(dú)立運(yùn)行,吧相互之間無依賴,對外無依賴,多次運(yùn)行之間無依賴。
    • Repeatable 可重復(fù)原則 單元測試是可重復(fù)運(yùn)動(dòng)的,每次的結(jié)果都穩(wěn)定可靠。

一個(gè)整套完善的單元測試可以保障后續(xù)的增添功能時(shí),程序迭代過程中,代碼的邏輯正確性。驗(yàn)證程序的輸入和輸出與最初設(shè)計(jì)一致。這對后續(xù)的集成測試等會(huì)提供巨大的幫助。同時(shí)也會(huì)有利于集成測試的順利進(jìn)行。

單元測試粒度

目前一些代碼掃描工具基本都給出了最低30%的單元測試代碼覆蓋率。這是一個(gè)最低限度,然而一個(gè)項(xiàng)目的覆蓋率,要綜合去考慮項(xiàng)目成本,人員安排等等因素。

關(guān)于單元測試的粒度,可以總結(jié)以下幾點(diǎn):

  • DAO層的單元測試: 對于基本CRUD,可以考慮跳過這一部分單元測試,而一些比較復(fù)雜的動(dòng)態(tài)更新、查詢等操作,建議用使用H2去做模擬單元測試。
  • Service層的單元測試:基本上一個(gè)Service里面肯定會(huì)依賴很多其他的service(此處也建議將成員變量通過構(gòu)造方法進(jìn)行注入,以便于單元測試去Mock),此時(shí)建議我們將依賴其他service的方法用Mock替代,Service里面的一些數(shù)據(jù)庫的操作也進(jìn)行Mock。這樣可以保證service測試的獨(dú)立性,不過對于邏輯復(fù)雜的方法可能要花很多時(shí)間在Mock上面。 如果發(fā)現(xiàn)需要Mock的方法過多,那么可能就需要考慮將要測試的方法是不是需要重構(gòu)。
  • Controller(API)層的單元測試:主要著重測試HTTP status在 200,400,500 等情況下的異常處理,request及response的轉(zhuǎn)換等。由于其余部分的代碼測試都已經(jīng)在其對應(yīng)的單元測試覆蓋,那么此時(shí)可以Mock絕大部分Serivce層中的方法。
  • 一般工具類的單元測試:一些工具類里面包含了比較多的邏輯,所以需要盡可能考慮多種情況下測試用例。

單元測試示例

單元測試可使用的第三方工具非常多,然而我們不可能精通每一個(gè),只有在不斷 的使用提高熟練程度。 對于SpringBoot而言可以直接引入spring-boot-starter-test , 它將會(huì)引入JUnit、Spring Test、AssertJ、Hamcrest(匹配對象) Mockito、JSONassert、JsonPath等工具庫。

  1. 如下是一個(gè)關(guān)于用戶登錄功能的測試示例
?
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class UserBizImplTest extends ParentTest {
    @Resource
    UserBiz userBiz;

    @MockBean
    UserService userService;

    private static List<User> userList = new ArrayList<>();

    @BeforeClass
    public static void setUp() throws Exception {
        System.out.println("setUp");
        // mock userService

        int code = 102;
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId((long) i + 1);
            user.setUsername("Tom" + code);
            user.setPassword("P@ssw0rd");
            userList.add(user);
            code++;
        }
    }


    @AfterClass
    public static void tearDown() throws Exception {
        System.out.println("tearDown");
    }

@Test
    public void test_08_login() {
        // scenario 1: login success
        // input data
        LoginInfoDTO loginInfoDTO = new LoginInfoDTO();
        loginInfoDTO.setPassword("P@ssw0rd");
        loginInfoDTO.setUsername("admin");

        // mock data & methods
        String dbPassword = CommonUtils.encode(loginInfoDTO.getPassword());
        User user = new User();
        user.setUsername("admin");
        user.setPassword(dbPassword);

        Mockito.when(userService.getOne(Mockito.any())).thenReturn(user);

        // verify
        try {
            String token = userBiz.login(loginInfoDTO);
            System.out.println(token);
        } catch (Exception e) {
            TestCase.fail();
        }

        // scenario 2: user not exist
        // input data
        loginInfoDTO.setUsername("notExistedUser");

        //mock data & methods
        Mockito.when(userService.getOne(Mockito.any())).thenReturn(null);

        // verify
        try {
            String token = userBiz.login(loginInfoDTO);
            System.out.println(token);
            TestCase.fail();
        } catch (UserAuthorityException ignored) {
            System.out.println(ignored);
        } catch (Exception e) {
            TestCase.fail();
        }

        // scenario 3: password error
        // input data
        loginInfoDTO.setUsername("admin");
        loginInfoDTO.setPassword("wrongPassword");

        //mock data & methods
        Mockito.when(userService.getOne(Mockito.any())).thenReturn(user);

        // verify
        try {
            String token = userBiz.login(loginInfoDTO);
            System.out.println(token);
            TestCase.fail();
        } catch (UserAuthorityException ignored) {
            System.out.println(ignored);
        } catch (Exception e) {
            TestCase.fail();
        }
    }
}
  1. 代碼詳解:

這段代碼是一個(gè)單元測試類,用于測試`UserBizImpl`類的登錄功能。讓我們逐步解釋這段代碼:

1. `@FixMethodOrder(MethodSorters.NAME_ASCENDING)`: 這是JUnit的一個(gè)注解,用于指定測試方法的執(zhí)行順序。在這里,它指定了按照方法名的字母順序(升序)執(zhí)行測試方法。

2. `public class UserBizImplTest extends ParentTest`: 這是測試類的定義,它繼承了一個(gè)名為`ParentTest`的父類。

3. `@Resource UserBiz userBiz`: 使用`@Resource`注解注入了`UserBiz`類的一個(gè)實(shí)例,即要被測試的業(yè)務(wù)類。

4. `@MockBean UserService userService`: 使用`@MockBean`注解模擬了`UserService`類的實(shí)例,這個(gè)類是`UserBizImpl`的一個(gè)依賴。

5. `private static List<User> userList = new ArrayList<>();`: 定義了一個(gè)靜態(tài)的`User`對象列表,用于存儲(chǔ)模擬數(shù)據(jù)。

6. `@BeforeClass public static void setUp() throws Exception`: 在所有測試方法運(yùn)行之前執(zhí)行的方法。在這里,它用于準(zhǔn)備測試數(shù)據(jù),模擬`UserService`的行為。

7. `@AfterClass public static void tearDown() throws Exception`: 在所有測試方法運(yùn)行之后執(zhí)行的方法。在這里,它用于清理測試數(shù)據(jù)或資源。

8. `@Test public void test_08_login()`: 這是一個(gè)測試方法,用于測試用戶登錄功能。

9. 在`test_08_login`方法中:

?? - 首先,定義了三個(gè)測試場景:

???? - 登錄成功的情況

???? - 用戶不存在的情況

???? - 密碼錯(cuò)誤的情況

?? - 對于每個(gè)場景,設(shè)置了輸入數(shù)據(jù)(用戶名和密碼)和模擬的行為(使用`Mockito.when`方法模擬了`UserService`的`getOne`方法的返回值)。

?? - 使用`userBiz`對象調(diào)用登錄方法,并對返回結(jié)果進(jìn)行驗(yàn)證。在成功登錄和用戶不存在的情況下,驗(yàn)證登錄成功;在密碼錯(cuò)誤的情況下,驗(yàn)證拋出了`UserAuthorityException`異常。

這段代碼通過模擬`UserService`的行為,測試了`UserBizImpl`類的登錄功能在不同場景下的行為。

參考

SpringBoot單元測試指南 - 知乎文章來源地址http://www.zghlxwxcb.cn/news/detail-842261.html

到了這里,關(guān)于Springboot Unit Test(單元測試)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot 如何使用 Spring Test 進(jìn)行集成測試

    SpringBoot 如何使用 Spring Test 進(jìn)行集成測試

    在開發(fā)過程中,單元測試是不可或缺的,它可以幫助我們及時(shí)發(fā)現(xiàn)代碼的問題并進(jìn)行修復(fù),從而提高代碼的質(zhì)量和可維護(hù)性。但是,單元測試只能測試單個(gè)方法或類的功能,無法測試多個(gè)模塊之間的交互和整個(gè)應(yīng)用程序的功能。因此,為了確保應(yīng)用程序的正確性和健壯性,我

    2024年02月10日
    瀏覽(21)
  • 【SpringBoot】SpringBoot單元測試

    【SpringBoot】SpringBoot單元測試

    單元測試(unit testing),是指對軟件中的 最小可測試單元(方法) 進(jìn)?檢查和驗(yàn)證的過程就叫單元測試。 單元測試是開發(fā)者編寫的??段代碼, ?于檢驗(yàn)被測代碼的?個(gè)很小的、很明確的(代碼)功能是否正確 。執(zhí)?單元測試就是 為了證明某段代碼的執(zhí)?結(jié)果是否符合我

    2023年04月17日
    瀏覽(21)
  • 單元測試|unittest生成測試報(bào)告

    單元測試|unittest生成測試報(bào)告

    測試報(bào)告為測試結(jié)果的統(tǒng)計(jì)即展示,是自動(dòng)化測試不可或缺的一部分,利用unittest 可以生成測試報(bào)告。 使用第三方 HTMLTestRunner 執(zhí)行測試用例集,生成網(wǎng)頁版測試報(bào)告 HTMLTestRunner是Python標(biāo)準(zhǔn)庫的unittest模塊的一個(gè)擴(kuò)展,在使用該模塊之前 要下載HTMLTestRunner.py文件,并將該文件保

    2024年02月09日
    瀏覽(17)
  • Unittest單元測試之unittest用例執(zhí)行順序

    Unittest單元測試之unittest用例執(zhí)行順序

    當(dāng)在一個(gè)測試類或多個(gè)測試模塊下,用例數(shù)量較多時(shí),unittest在執(zhí)行用例 (test_xxx)時(shí),并不是按從上到下的順序執(zhí)行,有特定的順序。 unittest框架默認(rèn)根據(jù)ACSII碼的順序加載測試用例,數(shù)字與字母的順序?yàn)椋?0~9,A~Z,a~z。 對于類來說,class TestAxx 會(huì)優(yōu)先于class TestBxx被執(zhí)行。

    2024年02月13日
    瀏覽(23)
  • 單元測試、集成測試、功能測試——Unittest

    單元測試、集成測試、功能測試——Unittest

    ?顆粒度最小,一般由開發(fā)小組采用白盒方式來測試,主要測試單元是否符合“設(shè)計(jì)”;是指 對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證 ?介于單元測試和系統(tǒng)測試之間,一般由開發(fā)小組采用白盒+黑盒的方法來測試,即驗(yàn) 證“設(shè)計(jì)”又驗(yàn)證“需求”。主要用來測試模板與模

    2023年04月08日
    瀏覽(27)
  • 單元測試(unit testing)到底是什么?

    做開發(fā)的同學(xué)應(yīng)該都聽說過單元測試(unit testing),因?yàn)閷卧獪y試的理解程度不同,所以對單元測試的看法也可能有所不同。本文就來深入講解一下單元測試的概念、作用和是否需要做單元測試。 單元測試(unit testing)是軟件開發(fā)中的一種最低級別的測試方式,對軟件中的

    2024年02月08日
    瀏覽(20)
  • 單元測試框架:unittest入門

    單元測試框架:unittest入門

    1、TestCase(測試用例): 一個(gè)testcase的實(shí)例就是一個(gè)測試用例 ;unittest 中執(zhí)行測試的最小單元,通過驗(yàn)證 unittest 提供的 assert 方法來驗(yàn)證一組特定的操作和輸入以后得到的響應(yīng);unittest 提供了一個(gè)名為 TestCase 的基礎(chǔ)類,可以用來創(chuàng)建測試用例; 2、TestSuite(測試套件): 多

    2024年02月09日
    瀏覽(17)
  • unittest單元測試

    當(dāng)你在編寫測試用例時(shí),可以使用Python內(nèi)置的 unittest 模塊來進(jìn)行單元測試。下面是一個(gè)逐步指南,幫助你理解如何編寫和運(yùn)行基本的單元測試。 導(dǎo)入必要的模塊 : 首先,你需要導(dǎo)入 unittest 模塊和需要測試的模塊(例如,你的 app.py )以及可能需要的其他模塊。 import unitte

    2024年02月13日
    瀏覽(35)
  • [Python]unittest-單元測試

    [Python]unittest-單元測試

    目錄 unittest的大致構(gòu)成: Test Fixture Test Case-測試用例 Test Suite-測試套件 Test Runner 批量執(zhí)行腳本 makeSuite() TestLoader discover() 用例的執(zhí)行順序 忽略用例執(zhí)行 skip skipIf skipUnless 斷言 HTML測試報(bào)告 錯(cuò)誤截圖 unittest是python中的單元測試框架 大致作用: 提供用例的組織與執(zhí)行-組織大量的測

    2024年02月08日
    瀏覽(18)
  • UnitTesting 單元測試

    ? 1.1 Unit Test : 單元測試 ? - test the business logic in your app : 測試應(yīng)用中的業(yè)務(wù)邏輯 ? 1.2 UI? Test :? 界面測試 ? - test the UI of your app : 測試應(yīng)用中的界面 ? 1.3 測試書籍網(wǎng)址: 《Testing Swift》 https://www.hackingwithswift.com/store/testing-swift ? 2.1 創(chuàng)建 ViewModel,UnitTestingBootcampViewModel.swift ?

    2024年02月07日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包