๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring๐Ÿƒ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

728x90

์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

 

๋‹จ์œ„ ํ…Œ์ŠคํŠธ : ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ์›์ธํŒŒ์•…์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

 

๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค

1. ๊ฐœ๋ฐœ

2. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ : ๊ฐœ๋ฐœ์ž ํ…Œ์ŠคํŠธ

3. QA Testing :

- ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŒ… : ์‚ฌ์šฉ์ž ๊ด€์  ํ…Œ์ŠคํŠธ

4. Production(๋ฐฐํฌ)

 

TDD๋ž€?

Test-Driven Development์˜ ์•ฝ์ž๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ›„ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ

~ ์„ค๊ณ„ - ํ…Œ์ŠคํŠธ - ๊ฐœ๋ฐœ ์ˆœ์„œ

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฐฉ๋ฒ•๋ก  :

Given - When - Then ~ ์ค€๋น„ - ์‹คํ–‰ - ๊ฒ€์ฆ ํŒจํ„ด

package com.sparta.myselectshop.entity;

import com.sparta.myselectshop.dto.ProductRequestDto;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;
// (1)
class ProductTest {
    @Test // (2)
    @DisplayName("์ •์ƒ ์ผ€์ด์Šค") // (3)
    void createProduct_Normal() {
        // (4) given - ์ค€๋น„!
        Long userId = 100L;
        String title = "์˜ค๋ฆฌ์˜จ ๊ผฌ๋ถ์นฉ ์ดˆ์ฝ”์ธ„๋Ÿฌ์Šค๋ง› 160g";
        String image = "https://shopping-phinf.pstatic.net/main_2416122/24161228524.20200915151118.jpg";
        String link = "https://search.shopping.naver.com/gate.nhn?id=24161228524";
        int lprice = 2350;

        ProductRequestDto requestDto = new ProductRequestDto(
                title,
                image,
                link,
                lprice
        );

        // (5) when - ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๋กœ์ง ์ˆ˜ํ–‰!
        Product product = new Product(requestDto, userId);

        // (6) then - ๊ฒ€์ฆ!
        assertNull(product.getId()); // (6-a)
        assertEquals(userId, product.getUserId()); // (6-b)
        assertEquals(title, product.getTitle());
        assertEquals(image, product.getImage());
        assertEquals(link, product.getLink());
        assertEquals(lprice, product.getLprice());
        assertEquals(0, product.getMyprice());
    }

}

(1) ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ ์ž๋™ ์ƒ์„ฑ

(2) ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , @Test๋กœ ์ปดํ“จํ„ฐ์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

(3) ํ…Œ์ŠคํŠธ ๋ผ๋ฒจ๋ง ์–ด๋…ธํ…Œ์ด์…˜

(4) given

(5) when

(6) then

assertNull์€ ์ฃผ์–ด์ง„ ์ธ์ž๊ฐ€ null์ด์–ด์•ผ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ

assertEquals ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ์ธ์ž ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์•„์•ผ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋กœ์ง์„ ๋‹จ์œ„๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

 

์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊ณ ๋ คํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ :

// ํšŒ์› Id
Long userId = 1230L;
// ์ƒํ’ˆ๋ช…
String title = "์˜ค๋ฆฌ์˜จ ๊ผฌ๋ถ์นฉ ์ดˆ์ฝ”์ธ„๋Ÿฌ์Šค๋ง› 160g";
// ์ƒํ’ˆ ์ด๋ฏธ์ง€ URL
String image = "https://shopping-phinf.pstatic.net/main_2416122/24161228524.20200915151118.jpg";
// ์ƒํ’ˆ ์ตœ์ €๊ฐ€ ํŽ˜์ด์ง€ URL
String link = "https://search.shopping.naver.com/gate.nhn?id=24161228524";
// ์ƒํ’ˆ ์ตœ์ €๊ฐ€
int lprice = 2350;

1. ํšŒ์› Id

1) ํšŒ์› Id๊ฐ€ null๋กœ ๋“ค์–ด์˜จ๋‹ค๋ฉด, ๊ด€์‹ฌ์ƒํ’ˆ์„ ๋“ฑ๋กํ•  ๊ฒฝ์šฐ ๋ˆ„๊ตฌ์˜ ์ƒํ’ˆ์œผ๋กœ ๋“ฑ๋ก๋˜๋Š”์ง€

2) ํšŒ์› Id๊ฐ€ ๋งˆ์ด๋„ˆ์Šค ๊ฐ’์ด๋ผ๋ฉด,

2. ์ƒํ’ˆ๋ช…

1) ์ƒํ’ˆ๋ช… ๊ฐ’์ด null์ด๋ผ๋ฉด,

2) ์ƒํ’ˆ๋ช…์ด ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ, ์ €์žฅ์„ ํ•ด์•ผ๋ ์ง€? ๊ทธ๋ฆฌ๊ณ  ์ €์žฅํ•œ๋‹ค๋ฉด, UI ํ‘œ์‹œ ๋ฐฉ์‹์€?

3. ์ƒํ’ˆ ์ด๋ฏธ์ง€ URL

1) ์ƒํ’ˆ ์ด๋ฏธ์ง€ URL์ด null๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ,

2) ์ƒํ’ˆ ์ด๋ฏธ์ง€ URL์ด URL ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด,

4. ์ƒํ’ˆ ์ตœ์ €๊ฐ€ URL

1) ์ƒํ’ˆ ์ตœ์ €๊ฐ€ URL์ด null์ธ ๊ฒฝ์šฐ,

2) ์ƒํ’ˆ ์ตœ์ €๊ฐ€ URL์ด URL ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ,

5. ์ƒํ’ˆ ์ตœ์ €๊ฐ€

1) ์ƒํ’ˆ ์ตœ์ €๊ฐ€๊ฐ€ 0์ด๋ผ๋ฉด,

2) ์ƒํ’ˆ ์ตœ์ €๊ฐ€๊ฐ€ ์Œ์ˆ˜๋ผ๋ฉด,

 

@BeforeEach : Given์˜ ์—ญํ• , ๊ธฐ๋ณธ๊ฐ’์„ ํ• ๋‹นํ•ด๋‘”๋‹ค

๋‹จ์œ„ํ…Œ์ŠคํŠธ์™€ Mock Object

์ด์ƒ์ ์œผ๋กœ, ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šคํ‹‘ ์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ฐ€์งœ ๊ฐ์ฒด(Mock Object)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

์„œ๋กœ ๊ฐ’์„ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ๊ณผ์ •์ด ๋ณต์žกํ•ด, ์–ด๋””์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ง€ ์ฐพ๊ธฐ ๋งค์šฐ ์–ด๋ ต๋‹ค
๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์™ธ ๋ถ€๋ถ„์—์„œ๋Š” ๋”๋ฏธ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ€์งœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ๋ฐ ํ˜ธ์ถœ

Mockito : Mock ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html

 

Mockito - mockito-core 4.10.0 javadoc

Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 4.10.0 https://javadoc.io/doc/org.mockito/mockito-core/4.10.0 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org

javadoc.io

 

728x90

'Spring๐Ÿƒ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Exception  (0) 2022.12.29
Spring AOP  (0) 2022.12.28
OAuth2  (0) 2022.12.27
์Šคํ”„๋ง ์ˆ™๋ จ : Project MySelectShop (3)  (0) 2022.12.15
์Šคํ”„๋ง ์ˆ™๋ จ : Project MySelectShop (2)  (0) 2022.12.15