inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

setup, teardown 동작 순서

미해결

실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트

안녕하세요! setup, teardown 강의를 보며 실습하고 있습니다. beforeAll 내에 console이 첫번째로 찍히다가 afterAll과 함께 사용할 경우에는 afterAll 바로 직전(마지막 바로 앞)에 찍히고 있습니다. (afterAll을 지울 경우에는 첫번째로 찍히고 있습니다.) beforeEach는 it을 실행하는 횟수만큼 실행되는거 같은데요. describe내에 선언한 beforeEach는 describe내에 호출한 it의 횟수만큼 실행되는게 맞는거 같은데 root의 beforeEach, afterEach도 it의 횟수만큼 실행되는게 맞을까요? 제가 사용한 코드와 출력화면 입니다. import { screen } from '@testing-library/react'; import React from 'react'; import TextField from '@/components/TextField'; import render from '@/utils/test/render'; beforeEach(() => { console.log('2. root - beforeEach'); }); beforeAll(() => { console.log('1. root - beforeAll'); }); afterEach(() => { console.log('5. root - afterEach'); }); afterAll(() => { console.log('6. root - afterAll'); }); describe('placeholder', () => { beforeEach(() => { console.log('3. placeholder - beforeEach'); }); afterEach(() => { console.log('4. placeholder - afterEach'); }); it('기본 placeholder "텍스트를 입력해 주세요."가 노출된다.', async () => { await render(<TextField />); const textInput = screen.getByPlaceholderText('텍스트를 입력해 주세요.'); expect(textInput).toBeInTheDocument(); }); it('placeholder prop에 따라 placeholder가 변경된다.', async () => { await render(<TextField placeholder="상품명을 입력해 주세요." />); const textInput = screen.getByPlaceholderText('상품명을 입력해 주세요.'); expect(textInput).toBeInTheDocument(); }); }); /** 실행 결과 2. root - beforeEach 3. placeholder - beforeEach 4. placeholder - afterEach 5. root - afterEach 2. root - beforeEach 3. placeholder - beforeEach 4. placeholder - afterEach 5. root - afterEach 1. root - beforeAll 6. root - afterAll */

  • javascript
  • react
  • 소프트웨어-테스트
  • vitest
dony 댓글 1 좋아요 0 조회수 252

@Value 관련 환경변수 주입 테스트코드 질문..

미해결

Practical Testing: 실용적인 테스트 가이드

@ActiveProfiles("test") @SpringBootTest class CategoryServiceTest { @Autowired private CategoryService categoryService; @DisplayName("카테고리 목록들을 조회한다.") @Test void getAllCategories() { System.out.println("222222222222222222"); } } @Service @RequiredArgsConstructor public class KakaoApiService { @Value("${social.kakao.apikey}") private String kakaoApiKey; @Value("${social.kakao.redirect_uri}") private String kakaoRedirectUri; } 위와 같이 코드가 있을때 테스트 코드를 실행시키면 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kakaoApiService': Injection of autowired dependencies failed 다음과 같은 에러가 발생하는데,, @SpringBootTest를 돌릴때 환경변수 주입을 못받아서 실패하는것 같은데 이럴 경우 어떻게 테스트를 진행해야할까요 ?? 전혀 관련 없는 서비스인데 에러가 터져서 진행이 안됩니다 ㅜㅜ.. ```yml spring: profiles: default: local social: kakao: apikey: ${KAKAO_API_KEY} redirect_uri: ${KAKAO_REDIRECT_URI} jwt: secret: ${JWT_SECRET} access_expiration_time: 36000000 --- # 테스트 환경 spring: config: activate: on-profile: test h2: console: enabled: true datasource: url: jdbc:h2:mem:~/ChallengeApplication driver-class-name: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true yml은 전체는 아니지만 이렇게 구성되어 있습니다. 환경 변수주입은 ChallengeApplication에 다 넣어놨는데, 이게 테스트코드를 돌릴시에는 ChallengeApplication가 도는게 아니라 Junit 하위에 있는게 돌아서 환경변수 주입이 안된게 돌아서 실행이 안되더라구요 .. 보통 어떤식으로 하시나요 ? ㅠㅠ

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
돈벌고싶다 댓글 2 좋아요 0 조회수 282

ResponseDto 위치 질문

미해결

Practical Testing: 실용적인 테스트 가이드

ResponseDto 위치 질문이 있습니다. 왜 이건 컨트롤러 reponse 패키지에 넣지 않고, service 패키지에 reponse 객체를 두는건가요 ?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
돈벌고싶다 댓글 2 좋아요 0 조회수 193

debounce 함수 테스트 정확도 관련 질문입니다.

미해결

실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트

안녕하세요. debounce 함수 테스트 관련 강의를 보고 궁금한 점이 있어 문의드립니다. debouncedFn이 300ms이 지난 후 실행되어야 함을 테스트할 때, 기존에 작성해주신 것 처럼 테스트할 시에는 함수가 300ms 후가 아닌 즉시 실행이 되거나 그보다 작은 시간이 지나고 실행이 되어도 테스트가 통과하게 됩니다. 그에 따라 아래처럼 작성하는 것이 더 정확한 테스트라고 생각이 되는데 이렇게 테스트하지 않는 이유가 있는지 궁금합니다! it('특정 시간이 지난 후 함수가 호출된다.', () => { const spy = vi.fn(); const debouncedFn = debounce(spy, 300); debouncedFn(); expect(spy).not.toHaveBeenCalled(); // 즉시 호출되지 않았는지 확인 vi.advanceTimersByTime(299); expect(spy).not.toHaveBeenCalled(); // 299ms 후에도 호출되지 않았는지 확인 vi.advanceTimersByTime(1); expect(spy).toHaveBeenCalledTimes(1); // 300ms 후에 정확히 한 번 호출되었는지 확인 expect(spy).toHaveBeenCalled(); });

  • javascript
  • react
  • 소프트웨어-테스트
  • vitest
박일상 댓글 2 좋아요 0 조회수 208

@RestControllerAdvice 와 @Validation

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 선생님 좋은 강의 잘 듣고 있습니다! 다름이 아니라 Validation과 ControllerAdvice에 대해 질문이 있습니다. 컨트롤러 테스트 할 때 빈 validation이 적용 된 모든 필드를 하나씩 모두 검증 하나요? 컨트롤러에서 request 필드가 많아서 하나씩 검증 하기엔 너무 테스트가 길지 않을까 고민 됩니다. 실무에서도 컨트롤러의 모든 필드를 검증 하나요? 공통 예외 처리는 어떻게 하는게 좋을까요? @RestControllerAdvice를 basePackages 설정 하여 처리 하고 있습니다. 예상치 못한 예외의 경우가 생길것을 대비 하여 basePackages가 없는 advice를 두었습니다. 이렇게 하니 우선 순위가 밀려서 GeneralAdvice 가 먼저 선택되어 Order로 우선순위 설정 해두었습니다. 처리 못한 예외를 각 advice에 넣자니 다른 advice도 코드가 중복 될것 같아 이렇게 처리 했는데 실무에서는 어떻게 처리 하시는지 궁금 하여 질문 남깁니다.!

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
조희제 댓글 2 좋아요 0 조회수 226

when then이 깔끔하게 나눠지지 않으면 주석을 어떻게 다는 편인가요?

미해결

Practical Testing: 실용적인 테스트 가이드

강의 BDD 스타일로 작성하기 까지 보고 질문드립니다. 정말 단순한 질문이긴 하지만 when에 해당하는 코드와 then에 해당하는 코드가 나눠지지 않으면 주석을 어떻게 다는 게 좋을지 궁금해졌습니다. 강의의 영업 시간 이전에 주문하면 예외를 던지는지 테스트하는 코드를 보면 when절과 then절이 하나로 뭉쳐 있다고 생각되는데, 아래처럼 그냥 한 줄에 when then을 모두 적는 게 좋을까요? @Test void createOrderBeforeOpenTime() { // given CafeKiosk cafeKiosk = new CafeKiosk(); Americano americano = new Americano(); cafeKiosk.add(americano); // when then assertThatThrownBy(() -> cafeKiosk.createOrder(LocalDateTime.of(2024, 11, 19, 9, 59))) .isInstanceOf(IllegalArgumentException.class) .hasMessage("주문 시간이 아닙니다. 관리자에게 문의하세요."); } 아니면 조금 이상하다고 생각되긴 하지만 아래처럼 나눠서 적는게 좋을까요? @Test void createOrderBeforeOpenTime() { // given CafeKiosk cafeKiosk = new CafeKiosk(); Americano americano = new Americano(); cafeKiosk.add(americano); // when assertThatThrownBy(() -> cafeKiosk.createOrder(LocalDateTime.of(2024, 11, 19, 9, 59))) // then .isInstanceOf(IllegalArgumentException.class) .hasMessage("주문 시간이 아닙니다. 관리자에게 문의하세요."); }

  • 소프트웨어-테스트
  • junit5
changi1122 댓글 2 좋아요 0 조회수 153

spring security @AuthenticationPrincipal rest docs 질문

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요 강사님 강의를 굉장히 잘 들었던 수강생입니다. 다름이 아니라 최근 spring security 를 도입하고 난 뒤에 rest docs 에 대해 문제가 생겨 질문하게 되었습니다. '회원 정보 조회' 라는 API 가 있고, 이 API 는 로그인을 한 뒤에 securityContextholder 에 담겨져 있는 객체를 사용하고자 파라미터로 @AuthenticationPrincipal 이라는 어노테이션을 이용하여 받고 있습니다. 그러나...restdocs 를 이용하여 해당 API 를 문서화 시키려고 할때 객체가 null 이 들어가서 테스트가 실패를 하게 되더라구요. docs 가 아닌 일반 controller test 에서는 @SpringBootTest 를 사용하여 @WithUserDetails 를 통해 테스트를 통과했습니다. 그러나 @SpringBootTest 를 따로 사용하고 있지 않은 상황에서 어떻게 해결할 수 있을지 고민입니다 ㅠㅠ 감사합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
leeseongju 댓글 2 좋아요 0 조회수 222

브랜치 git clone 질문

미해결

실무에 바로 적용하는 프런트엔드 테스트 - 2부. 테스트 심화: 시각적 회귀・E2E 테스트

질문 git clone https://github.com/practical-fe-testing/test-example-shopping-mall.git 를 했는데 폴더안에 gitignore 과 readme 파일만 있는데 해당 브랜치를 clone해서 사용하는게 아닌건가요? 참고사항 대체방안으로 zip파일로 다운받아서 사용하고 있긴합니다!

  • javascript
  • tdd
  • 소프트웨어-테스트
  • vitest
  • e2e
  • chromatic
한나릴 댓글 1 좋아요 0 조회수 160

비동기 함수 테스트 중 특정 케이스 에러

미해결

테스트 with Jest: 제로초에게 제대로 배우기

비동기 함수 테스트 강의를 따라했을 때 제 컴파일러에서는 오류가 발생합니다. 다른 테스트 케이스들 말고 아래 두 케이스에서만요. test('okPromise 테스트', () => { const okSpy = jest.fn(okPromise); return okSpy.then((result) => { expect(result).toBe('ok'); }) }) test('noPromise 테스트', () => { const noSpy = jest.fn(noPromise); return noSpy.catch((result) => { expect(result).toBe('ok'); }) }) 각 테스트 별 에러 메세지는 다음과 같습니다. 'Mock<Promise<string>, [], any>' 형식에 'then' 속성이 없습니다.ts(2339) 'Mock<Promise<never>, [], any>' 형식에 'catch' 속성이 없습니다.ts(2339) 코드를 동일하게 작성했음에도 불구하고, 어떤 문제로 위 에러가 발생하는 걸까요?

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
모락 댓글 1 좋아요 0 조회수 209

appium studio download 문의드립니다.

미해결

쉬운 모바일 테스트 자동화 시작하기 : Appium Studio

안녕하세요 강의에 appium studio download 방법이 자세히 나와있지 않아 문의드립니다. 영상내에서 홈페이지에서 간단하게 신상정보 입력 후 이메일을 통해 다운로드 링크를 받으라고 안내해주셨는데 아래 링크가 맞는지 문의드립니다. https://digital.ai/products/continuous-testing/appium-studio/free-trial/ 위 링크에 정보 입력 후 등록한지 30분가량이 되었지만 메일로 링크는 못받고있는데 보통 얼마나 소요가 될까요?

  • ios
  • android
  • 소프트웨어-테스트
  • qa(품질보증)
  • appium-studio
박재현 댓글 2 좋아요 0 조회수 324

정적 팩토리 메서드 사용과 toEntity 메서드에 대해 질문 있습니다.

미해결

Practical Testing: 실용적인 테스트 가이드

우선 빌더를 활용해 내부에서 객체를 생성하고 외부에서 해당 객체를 생성하려면 정적 팩토리 메서드를 사용하거나 혹은 toEntity 같은 메서드를 만들어 사용하면 좋을거 같다 라는 생각이 들었습니다. 궁금한 점은 외부에서 객체를 생성할때 어떤 경우에는 정적 팩토리 메서드를 사용해서 생성하고 어떤 경우에는 toEntity 같은 메서드를 만들어서 사용하면 좋을지 궁금합니다. @Getter @NoArgsConstructor public class ProductCreateServiceRequest { private ProductType type; private ProductSellingStatus sellingStatus; private String name; private int price; @Builder private ProductCreateServiceRequest(ProductType type, ProductSellingStatus sellingStatus, String name, int price) { this.type = type; this.sellingStatus = sellingStatus; this.name = name; this.price = price; } public Product toEntity(String nextProductNumber) { return Product.builder() .productNumber(nextProductNumber) .type(type) .sellingStatus(sellingStatus) .name(name) .price(price) .build(); } }

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
감바스 댓글 2 좋아요 0 조회수 236

인프라계층 구현체와 테스트 구현체에 대한 질문

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

안녕하세요. UserRepository 를 구현하는 구현체로는 UserJpaRepository 를 사용하는 UserRepositoryImpl 와 테스트용 구현체인 FakeUserRepository 가 있는데요. TDD라는게 단순 객체지향적인 설계를 잘하는 방법론이라면 납득이 가는데, 실제 서비스 되어야 할 코드가 잘 동작하는지 검증하기 위함이라는 관점에서는 조금 궁금한점이 생겨 질문드립니다. FakeUserRepository 는 UserRepository 의 계약을 잘 이행하고 테스트도 성공하도록 잘 구현하였습니다. 그런데 실제 서비스에 사용될 UserRepositoryImpl 는 한번도 검증된 적 없는데 테스트를 통해 어떻게 소프트웨어가 변화함에 있어서 확신을 가질 수 있나요? UserRepositoryImpl 내부 구현이 변경되었을때 여전히 FakeUserRepository 만 테스트를 실행할텐데 어떤식으로 개발 과정에서 확신을 얻을 수 있는지 궁금합니다. 추가적으로 TDD의 역할에는 어떤 구현 기술에 대해 잘 사용되었는지에 대한 검증은 포함되지 않나요? 예를 들어 스프링 데이터 JPA를 잘 사용하였는지..? 예를 들자면 저는 TDD를 해본적은 없지만 실제 실행되는 인프라 계층을 실행해볼 수 있는 샘플 테스트코드 개념으로 만들어서 사용하고 있는데요. 제가 개발하고 있는 기업용 솔루션이 버전이 높아짐에 따라 워낙 무거워져서 로컬 PC에서 WAS를 기동하는데에만 2분이 넘기 때문에 최소한의 인프라계층 혹은 인프라계층의 협력 클래스들정도는 테스트 코드로 직접 테스트해볼 수 있도록 테스트 코드를 작성해 두었습니다. 이렇게 해두면 어떤 이슈가 발생했을때도 곧바로 쉽게 테스트가 가능하니까요. 물론 DB 개발서버 장비에 연결하고 더미데이터를 가지고 실행하는 식으로요. 이번 강의에서 H2를 통한 인프라 테스트 강의까지가 딱 제가 하고 있는 테스트들이었는데요. 중간에 놓친것인지 테스트가 무거워진다는 설명만 하고 그뒤로는 리팩토링과 함께 인프라 레벨의 테스트는 언급을 안하셔서 제가 생각하는 구현 기술을 잘 사용하여 실제 서비스되는 인프라 모듈을 직접 테스트 하는 부분은 어떻게 해야할지 궁금합니다.

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
dlsrksrhk 댓글 1 좋아요 0 조회수 240

TS로 변경 시 "type": "module" 제거 이유가 궁금합니다.

미해결

테스트 with Jest: 제로초에게 제대로 배우기

확장자를 TS로 변경했을 때 코드에는 ESM의 import , export 를 사용했는데 왜 package.json파일의 ESM 관련 옵션인 "type": "module" 을 제거하는지 궁금합니다. GPT의 답변에 의하면 TS 파일은 컴파일 과정에서 CommonJS나 ESM이나 알맞게 변환을 하기 때문에 해당 옵션이 필요 없고, Jest와의 호환성을 위해 "type": "module" 을 제거해주는 것이고, JS파일은 기본적으로 CommonJS모듈 시스템을 사용하기 때문에 import문을 사용했으면 ESM방식으로 해석하도록 명시하기 위해서 "type": "module" 을 추가한다. 라고 설명을 해주는데 그럼 JS 파일의 경우 Jest와의 호환성을 고려하지 않는건지.. 이해가 잘 되지 않습니다. 혹시 설명을 해주실 수 있을까요?

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
모락 댓글 2 좋아요 0 조회수 331

jest.config.js 파일 내용 다른 분들 참고

미해결

테스트 with Jest: 제로초에게 제대로 배우기

환경 : mac os 저의 경우에 npx ts-jest config:init 명령어를 통해 생성한 jest.config.js 파일의 내용이 다음과 같이 강의 영상과 달랐습니다. /** @type {import('ts-jest').JestConfigWithTsJest} **/ module.exports = { testEnvironment: "node", transform: { "^.+.tsx?$": ["ts-jest",{}], }, }; 강의 영상 내용에 맞춰서 preset: 'ts-jest' 설정을 추가해주어 Jest가 TypeScript 파일을 컴파일하고 실행할 수 있도록 해주니 잘 동작합니다.

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
댓글 2 좋아요 0 조회수 354

Integration Test Truncate

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요! 좋은 강의 잘 들었습니다!! 강의 듣고, 테스트 적용해보며 한가지 궁금한게 생겼는데요! 테스트 데이터 삭제의 건 입니다! 요구사항이 다음과 같다고 한다면, 어떤 방법을 내리실 지 궁금해서요! Test라는 별도의 환경 없음. 로컬 개발환경은 개발DB를 바라보는 상황 JPA가 아닌 MyBatis Unit Test가 아닌 integration Test 혹시 이런 상황이라면, 테스트를 진행하며 추가되거나 변경된 데이터들을 어떻게 삭제할 수 있을까요 ?? 더 나아가서는, 성능테스트를 진행한다면 별도의 Test 환경이 없을 때 성능테스트를 진행하며 생긴 대량의 데이터들을 어떻게 원래대로 원복 시킬 수 있을까요 ?? 감사합니다!

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
skehdxhd 댓글 1 좋아요 0 조회수 116

readOnly = true 시 jpa 동작관련

미해결

Practical Testing: 실용적인 테스트 가이드

readOnly = true 시에는 jpa 에서는 단순 cud 는 동작하지만, 변경감지는 안된다는 말씀이신가요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
개foot 댓글 2 좋아요 0 조회수 248

자바 익셉션 종류도 외우시나요??

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요. 강의를 수강하다가 문득 의문이 들었는데, 테스트 코드를 작성하실때 어떤 exception을 던질지도 다 알고 계신것 같더라구요! 예를들어, 아메리카노를 0개 주문할때는 IllegalArgumentException을 던진다거나요.... 혹시 이런 익셉션의 종류들도 전부 시간을 들여 외워야 할까요??? 아니면 자연스레 체득되길 기다릴까요??

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
HJ 댓글 2 좋아요 0 조회수 179

강의 교안

미해결

테스트 with Jest: 제로초에게 제대로 배우기

안녕하세요 제로초님. 강의 교안이 어디있는지 모르겠습니다.

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
gomteng03 댓글 2 좋아요 0 조회수 283

private 메서드를 public으로 바꾸면 어떤가요?

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요, 우빈님 강의 정말 잘 듣고 있습니다! 한가지 의문점이 드는 것은 private 메서드는 테스트를 하지 않고 그냐 유지하되, 필요 시에 따로 클래스를 분리하여 객체를 만드신다고 했는데요, 그냥 간편히 private 메서드를 public 메서드로 변환해서 내부 호출하는 방법은 별로 고려되지 않은 것 같은데 따로 이유가 있을까요? 혹시 createNextProductNumber()가 ProductService 클래스의 성격과는 맞지 않아서 분리하는 경우인지, createNextProductNumber()가 결국 다른 곳에서 사용 될 수 있이므로 별도의 파일로 관리하는지 궁금합니다

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
돈까스는맛있어 댓글 2 좋아요 0 조회수 171

Cypress io가 유료인가요?

미해결

2시간으로 끝내는 프론트엔드 테스트 기본기

Cypress Colud Trial 13 days left라고 뜨는데 유료로 바뀌었나요?

  • react
  • jest
  • 소프트웨어-테스트
  • Cypress
  • storybook
  • chatgpt
ChangJun.dev 댓글 2 좋아요 0 조회수 287

인기 태그

인프런 TOP Writers

주간 인기글