멋사 Backend Plus 30일차 🦁

μ‹ μž¬μ›Β·2023λ…„ 12μ›” 5일

μ˜€μ „μ—λŠ” API λΆ€ν•˜ν…ŒμŠ€νŠΈλ₯Ό ν• μˆ˜μžˆλŠ”
ngrinder 도ꡬ (λ„€μ΄λ²„μ—μ„œ λ§Œλ“€μ—ˆλ‹€κ³  ν•œλ‹€) λ₯Ό 도컀 λ°μŠ€ν¬νƒ‘μ— λ„μš°κ³  μ‹€μŠ΅μ„ ν•΄λ³΄μ•˜λ‹€.

μ˜€ν›„μ—λŠ” μƒν’ˆμ„ λ‹΄λŠ” μž₯λ°”κ΅¬λ‹ˆ κΈ°λŠ₯에 λŒ€ν•΄ κ΅¬ν˜„ν•˜μ˜€κ³ , Mock 객체λ₯Ό μ‚¬μš©ν•΄ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€.

μ˜€μ „

  • ngrinder λž€ API λ₯Ό λΆ€ν•˜ ν…ŒμŠ€νŠΈ ν• μˆ˜ μžˆλŠ” 도ꡬ (Tool) μž…λ‹ˆλ‹€.
    https://hub.docker.com/r/ngrinder/controller/ 도컀 곡식 λ¬Έμ„œλ₯Ό 보며 Controller 와 Agent λ₯Ό Pull λ°›μ•˜λ‹€.

  • 도컀 곡식 λ¬Έμ„œμ˜ μˆœμ„œλŒ€λ‘œ μ§„ν–‰ν•˜μ˜€λ‹€λ©΄ http://localhost:80 μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜κ²Œ 되면 μ•„λž˜μ˜ ν™”λ©΄μœΌλ‘œ 접속될 것이닀.

User ID 와 Password λŠ” μ²˜μŒμ—λŠ” λ‘˜λ‹€ admin 으둜 μ„€μ • λ˜μ–΄μžˆλ‹€.

User ID 와 Password λ₯Ό μž…λ ₯ν•˜κ³  μ ‘μ†ν•˜κ²Œλ˜λ©΄,

μ΄λŸ¬ν•œ 화면이 접속 되게 λ˜λŠ”λ°, 맨 μœ„μ— 탭을 보게 되면, μ„±λŠ₯ 검사와, μŠ€ν¬λ¦½νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€.



슀크립트 탭을 ν΄λ¦­ν•˜μ—¬ μ ‘μ†ν•˜κ²Œ 되면, 슀크립트λ₯Ό λ§Œλ“€μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©ν•˜λ©΄μ„œ λŠλ‚€μ μ€ μŠ€ν¬λ¦½νŠΈλž€ 양식을 λ§Œλ“œλŠ” 것 처럼 API의 양식을 λ§Œλ“œλŠ” 것 μž…λ‹ˆλ‹€.



슀크립트λ₯Ό μž‘μ„±ν•˜λŠ” 것 이며, URL μ—λŠ” localhost:~, 127.0.0.1 의 URL 을 μ‚¬μš©ν• μˆ˜ μ—†μœΌλ©°, 본인 IP ν˜Ήμ€ 배포후 URL 이 λ“€μ–΄κ°€μ•Ό λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.


슀크립트의 μž‘μ„±μ΄ λλ‚˜λ©΄ Validate λ²„νŠΌμ„ 눌러 슀크립트λ₯Ό ν™•μΈν•˜λ©°, 초기 맨 μœ„μ˜ νƒ­μ—μ„œ μ„±λŠ₯ 검사 탭을 눌러 μ„±λŠ₯ 검사λ₯Ό ν•˜λ©΄ λ©λ‹ˆλ‹€.
(λ‚˜λŠ” μ—¬κΈ°μ„œ Validate λ²„νŠΌμ„ λˆ„λ₯΄λ‹ˆκΉŒ μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€.)

λ²ˆμ™Έ

ngrinder 의 Controller 와 Agentλ₯Ό 도컀λ₯Ό 톡해 λ„μš°κ²Œ 되면 CPUλ₯Ό μ—„μ²­λ‚˜κ²Œ μ‚¬μš©ν•œλ‹€.
λ…ΈνŠΈλΆ Fan (선풍기)이 μ—„μ²­ μ‹¬ν•˜κ²Œ λ„λŠ” 것을 μ•Œμˆ˜ μžˆλ‹€.

μ˜€ν›„

  • mokito κ΄€λ ¨ λ©”μ†Œλ“œμ— λŒ€ν•΄μ„œ 정리 ν•˜λŠ” 글을 μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ¨Όμ € μž₯λ°”κ΅¬λ‹ˆ 생성 κΈ°λŠ₯의 μ½”λ“œλ₯Ό 보며 μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

@ExtendWith(MockitoExtension.class)
@Transactional
class CartServiceImplTest {
    @Mock
    private CartRepository cartRepository;

    @InjectMocks
    private CartServiceImpl cartService;
    
    @DisplayName("카트 생성 확인")
    @Test
    void create_Cart() {
        Member member = Member.builder()
                .username("shin")
                .password("qwer1234")
                .build();

        cartService.createCart(member);

        verify(cartRepository, times(1)).save(any());
    }
}

@ExtendWith(MockitoExtension.class) : mokito의 @Mock을 μ‚¬μš© ν•˜κΈ° μœ„ν•΄ μž‘μ„± ν•œλ‹€.
@Mock : mock 객체λ₯Ό 생성 ν•΄μ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜ 이며, λŒ€μ²΄λ‘œ μ˜μ‘΄μ„± μ£Όμž…μ„ μœ„ν•΄ μž‘μ„±ν•œ ν•„λ“œμ— 많이 μ‚¬μš© ν•˜λŠ” 것 κ°™λ‹€.
@InjectMocks : μƒμ„±λœ mock 객체λ₯Ό μ£Όμž…ν• λ•Œ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜ 이며, μ‰½κ²Œ μƒκ°ν•˜μ—¬ λ ˆν¬μ§€ν† λ¦¬κ°€ μ„œλΉ„μŠ€μ— μ£Όμž… λ˜λŠ” 것 처럼 μ‚¬μš© ν•©λ‹ˆλ‹€.
(주둜 μ„œλΉ„μŠ€ ν΄λž˜μŠ€μ— @InjectMocks λ₯Ό μ‚¬μš©)

verify() : νŠΉμ • Mock 객체의 λ©”μ†Œλ“œ ν˜ΈμΆœμ„ κ²€μ¦ν• λ•Œ μ‚¬μš© ν•©λ‹ˆλ‹€. 즉 μœ„ μ½”λ“œμ—μ„œλŠ” save() λ©”μ†Œλ“œλ₯Ό 검증 ν•˜λŠ” 것 μž…λ‹ˆλ‹€.
times(횟수 μž…λ ₯) : ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ λͺ‡λ²ˆ 호좜 λ˜μ—ˆλŠ”μ§€ κ²€μ¦ν•˜λŠ” λ©”μ†Œλ“œ μž…λ‹ˆλ‹€.
any() : any() λ©”μ†Œλ“œλž€ μ–΄λ–€ 값이든 μ–΄λ–€ μΈμžκ°€ 전달 λ˜λ˜μ§€ 간에 호좜이 λ˜μ—ˆλŠ”μ§€λ§Œ 검증 ν•©λ‹ˆλ‹€.

더 λ‹€μ–‘ν•œ λ©”μ†Œλ“œκ°€ μ‘΄μž¬ν•˜μ§€λ§Œ, μ˜€λŠ˜μ€ mock을 쑰금 μ•Œμ•„κ°€λŠ” μ‹œκ°„μœΌλ‘œ ν•œκ°€μ§€ κΈ°λŠ₯ 밖에 ν…ŒμŠ€νŠΈ ν•˜μ§€ λͺ»ν–ˆλ‹€.

0개의 λŒ“κΈ€