묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
오류메세지는 확인했는데 어떻게 고쳐야 할지 모르겠습니다 ㅠ
TODO앱을 클래스앱에서 컴포넌트 함수형 으로 바꾸는과정에서 뭔가 문제가 생겼는지 아니면 이전부터 문제가 있었는지는 모르겠는데 이런오류가 뜨면서 되지않네요 ㅠㅠ 리액트 초짜라 뭘 어떻게 바꿔야할지 모르겠습니다 ㅠㅠ 답변부탁드립니다 감사합니다 ㅠㅠ위에 문제가 된다고 하는 6행 74행 사진입니다 ㅠㅠ
-
해결됨실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
테스트 코드 파일 위치
안녕하세요! 강의 잘 보고 있습니다. :)다름이 아니라 테스트 코드 파일들의 작성 위치가 궁금한데요, 보니까 그냥 파일 바로 아래에 새로운 테스트 코드 파일이 있는 것 같은데 이게 보편적인 위치일까요?따로 테스트 코드 폴더를 만들거나 하진 않는 건지 궁금해서 문의드립니다.감사합니다 :)
-
해결됨실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
async-await 이 꼭 있어야하는지 질문입니다
안녕하세요. 강의 너무 재밌게 잘 보고 있습니다. 두가지 질문이 있어서 문의글 남깁니다. 질문 1. 테스트코드에서 async, await 가 필요없어 보이는 곳에도 꼭 붙이는 이유가 있나요? 예를들면, 아래 1번 코드에서 async await 이 반드시 필요한 이유가 있는건가요? 저는 2번처럼 async-await을 제거해도 테스트가 정상 통과 되어서요. 특별한 목적이 있어서 붙여야 하는건지 궁금합니다. ! 1) it('총 상품 금액은 "$500.00"로 노출된다', async () => { await render(<TestPayment />); expect(screen.getByText('500.00')).toBeInTheDocument(); }); 2)it('총 상품 금액은 "$500.00"로 노출된다', () => { render(<TestPayment />); expect(screen.getByText('500.00')).toBeInTheDocument(); }); 질문 2. render 함수를 util 로 만들어서 사용하시는데, userEvent.setup의 user 도 함께 들어있는 이유가 궁금합니다. userEvent를 쓰지 않는 테스트코드도 있는데, 꼭 함께 들어있어야하나 하는 생각이 들어서요 ㅎㅎ userEvent를 더 편리하게 사용하기 위함인가요? export default async (component, options = {}) => { const { routerProps } = options; const user = userEvent.setup(); return { user, ...render( <QueryClientProvider client={queryClient}> <MemoryRouter {...routerProps}>{component}</MemoryRouter> <Toaster /> </QueryClientProvider>, ), }; }; 감사합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
사용되는 아키텍처에 대해
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 선생님 강의 잘보고 있습니다. 질문드리고 싶은 부분은 강의에서 사용되는 아키텍처에 대한 것입니다. 레이어드 아키텍처라는것은 이해했지만, 패키지 구조가 생소해서 어떻게 구성되는지는 이해하기 어려운것 같습니다. 제가 아는 방식은 컨트롤러, 서비스, 리파짓토리, 도메인 패키지로 단순하게 작성하는 방법인데, 여기서 사용된 패키지 구성방식과 관련된 키워드나 레퍼런스를 얻을 수 있을가요?
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
에러 처리를 위한 단위테스트 작성
에러 처리를 위한 단위테스트 작성 강의 내용 중 이해가 가지 않는 부분이 생겨 글 남김니다.errorMessage 의 message 내용은 description property missing 에러입니다. 그렇다면 테스트 상황에서 포스트맨과 동일하게 description이 빠진 객체를 저장하다 에러가 발생해야 맞는 테스트가 아닌가 하는 의문이 생기네요.it('should handle errors', async () => {const errorMessage = {message: "description property missing"}; const rejectedPromise = Promise.reject(errorMessage); productModel.create.mockReturnValue(rejectedPromise); await controller.createProduct(req, res, next); expect(next).toBeCalledWith(errorMessage);})
-
해결됨쥬쥬와 함께 하루만에 끝내는 스프링 테스트
카프카 실행에 문제가 있는 분들
노션에 작성된 의존성에 는 org.testcontainers:kafka 라고 적혀있는데, org.testcontainers:kafka:1.19.0 와 같이 버전 명시해주시면 해결됩니다.
-
미해결쥬쥬와 함께 하루만에 끝내는 스프링 테스트
github action 통합 테스트 build 오류 건
안녕하세요 🙂 github action build 시 오류가 발생하여 해결 방안을 찾고자 질문 내용을 작성했습니다.-- IntegrationTest.classpackage com.dnd.gooding.integration; import java.io.File; import java.time.Duration; import java.util.HashMap; import java.util.Map; import org.junit.Ignore; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.transaction.annotation.Transactional; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; @Ignore @Transactional @SpringBootTest @ContextConfiguration(initializers = IntegrationTest.IntegrationTestInitializer.class) public class IntegrationTest { static DockerComposeContainer rdbms; static { rdbms = new DockerComposeContainer(new File("infra/test/docker-compose.yml")) .withExposedService( "local-db", 3306, Wait.forLogMessage(".*ready for connections.*", 1) .withStartupTimeout(Duration.ofSeconds(180L))) .withExposedService( "local-db-migrate", 0, Wait.forLogMessage("(.*Successfully applied.*)|(.*Successfully validated.*)", 1) .withStartupTimeout(Duration.ofSeconds(180L))); rdbms.start(); } static class IntegrationTestInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { Map<String, String> properties = new HashMap<>(); String rdbmsHost = rdbms.getServiceHost("local-db", 3306); Integer rdbmsPort = rdbms.getServicePort("local-db", 3306); properties.put( "spring.datasource.url", "jdbc:mysql://" + rdbmsHost + ":" + rdbmsPort + "/gooding"); TestPropertyValues.of(properties).applyTo(applicationContext); } } } -- GoodingApplicationTest.classclass GoodingApplicationTest extends IntegrationTest { @Test void contextLoads() { } }-- Github Action 스크립트name: Pull Request Test on: pull_request: types: [opened, synchronize, reopened] permissions: read-all jobs: build-test: runs-on: ubuntu-latest permissions: contents: read pull-requests: write steps: - name: Git Checkout uses: actions/checkout@v3.0.2 - uses: dorny/paths-filter@v2 id: changes with: filters: | application: - 'build.gradle' - 'src/**' - name: JDK 설치 if: steps.changes.outputs.application == 'true' uses: actions/setup-java@v3 with: distribution: zulu java-version: 17 cache: 'gradle' - name: Gradle Build if: steps.changes.outputs.application == 'true' run: | chmod +x ./gradlew ./gradlew build --parallel-- Github Action 오류 발생혹시 해당 오류의 원인을 알 수 있을까요..?? ㅠ 감사합니다 ㅠ
-
해결됨Practical Testing: 실용적인 테스트 가이드
안녕하세요 재고 테이블에 대해서 질문 있습니다.!
안녕하세요 멘토님 강의 잘듣고 있습니다!제가 테이블을 언제 만들어야 하고 합쳐야 되는지에 대해서 잘 모르겠습니다. 혹시 검색 키워드와 상품테이블에서 재고를 관리하지 않고 따로 테이블을 만든 이유가 있을까요 ?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
creactStore질문이요
미들웨어에서 rootReducer 하나만 넣었을 땐 문제 없는데 2번째 인자 넣을때부터 에러가 계속 나는데 이유를 모르겠습니다.
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
spring initializer gradle 에서 3.x.x 대 밖에 없어요. 2.x.x는 보이지 않는데 어떡하져
spring initializer gradle 에서 3.x.x 대 밖에 없어요. 2.x.x는 보이지 않는데 어떡하져
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
혹시 git 플러그인 아시는 분
수업에서 git 커밋메세지 사용할 때 옆에 나오는 것들 어떻게 나오는지 아시는 분 계시나요?intellij 기능인지 플러그인인지 인 것 같은데요.아시는 분 있으시면 답변 주시면 감사하겠습니다.
-
해결됨실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
2.1 테스트 구동 실패
안녕하세요 2.1 class 단위 테스트를 작성하고 `npm run test`로 테스트를 구동 했을 때, 다음과 같이 테스트를 실패하고 있습니다. `nvm use`, 'npm ci'를 모두 마친 상황인데, 어떤 문제를 해결해야 할까요? 혹시나 싶어 스토리북을 구동했을 때는, 문제 없이 scripts 명령어를 입력했을 때 실행이 되는 것을 확인할 수 있었습니다.!github branch의 unit-test-example을 pull 받아서 진행했습니다!운영체제: Windows 11 import { screen } from '@testing-library/react'; import React from 'react'; import TextField from '@/components/TextField'; import render from '@/utils/test/render'; it('className Prop으로 설정한 css class가 적용된다.', async () => { // Arrange - 테스트를 위한 환경 만들기 // -> className을 지닌 컴포넌트 렌더링 await render(<TextField className="my-class" />); // Act - 테스트할 동작 발생 // -> 렌더링에 대한 검증이기 때문에 이 단계는 생략 // -> 클릭이나 메서드 호출, prop 변경 등등에 대한 작업이 여기에 해당 합니다. // Assert - 올바른 동작이 실행되었는지 검증 // -> 렌덩링 이후 DOM에 해당 class가 존재하는지 검증 // TextField는 placeholder 요소가 있습니다. // vitest의 expect 함수를 사용하여 기대 결과를 검증 expect( screen .getByPlaceholderText('텍스트를 입력해 주세요.') .toHaveClass('my-class'), ); }); FAIL src/components/tests/TextField.spec.jsx [ src/components/tests/TextField.spec.jsx ] Error: C:\Users\js953\Desktop\Github\fe-test\test-example-shopping-mall\src\components\tests\TextField.spec.jsx 21:3 error Expect must have a corresponding matcher call vitest/valid-expect ✖ 1 problem (1 error, 0 warnings) ❯ formatError node_modules/vite/dist/node/chunks/dep-abb4f102.js:43916:46 ❯ TransformContext.error node_modules/vite/dist/node/chunks/dep-abb4f102.js:43912:19 ❯ TransformContext.transform node_modules/vite-plugin-eslint/dist/index.mjs:1:1989 ❯ Object.transform node_modules/vite/dist/node/chunks/dep-abb4f102.js:44206:30 ❯ loadAndTransform node_modules/vite/dist/node/chunks/dep-abb4f102.js:54851:29 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed (1) Tests no tests Start at 12:45:37 Duration 1.63s (transform 743ms, setup 883ms, collect 0ms, tests 0ms, environment 408ms, prepare 109ms) FAIL Tests failed. Watching for file changes... press h to show help, press q to quit ```Test result not found. If you set `vitest.commandLine` please check: Did you set `vitest.commandLine` to `run` mode? (This extension requires `watch` mode to get the results from Vitest api) Does it have the ability to append extra arguments? (For example it should be `yarn test --` rather than `yarn test`) Are there tests with the same name? Can you run vitest successfully on this file? Does it need custom option to run? Vitest output: DEV v0.33.0 C:/Users/js953/Desktop/Github/fe-test/test-example-shopping-mall API started at http://127.0.0.1:60930 ❯ src/components/tests/TextField.spec.jsx (0 test)
-
미해결Practical Testing: 실용적인 테스트 가이드
이상한 url로 요청해도 200이 반환됩니다. 그리고 body가 비어있어요...
@WebMvcTest(CompanyController::class) @ActiveProfiles("test") @WithMockUser class CompanyControllerTest { @Autowired lateinit var mockMvc: MockMvc @MockBean lateinit var getCompanyService: GetCompanyService @MockBean lateinit var adminAuthorizationFilter: AdminAuthorizationFilter private val cookie = Cookie(ADMIN_AUTH_TOKEN, "admin-auth-token") @DisplayName("회사 목록 조회") @Test fun findAll() { // given val companies = listOf( companyEntity(1, "A"), companyEntity(2, "B"), companyEntity(3, "C"), ) `when`(getCompanyService.findAll()).thenReturn(companies) // when val request = MockMvcRequestBuilders.get("/admin/api/v1/companies") .cookie(cookie).accept(MediaType.APPLICATION_JSON) // then mockMvc.perform(request) .andExpect(MockMvcResultMatchers.status().isOk) .andDo(MockMvcResultHandlers.print()) } } 위 코드를 가지고 질문드리겠습니다. val request = MockMvcRequestBuilders.get("/admin/api/v1/companies") 이 부분에서 companies가 아니라 존재하지 않는 url(ex. /admin/api/v1/cfasfsdfcompanies)라고 한 후 위 코드를 돌리면 200나옵니다. 존재하지 않는 url도 호출이 가능한건가요?그리고 body가 항상 빈 값입니다.MockHttpServletResponse: Status = 200 Error message = null Headers = [Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"] Content type = null Body = Forwarded URL = null Redirected URL = null Cookies = []목킹이 잘못되었는지 점검해보려고 getCompanyService.findAll() 를 호출해보았는데 3개가 정상적으로 나옵니다. 혹시 몰라 소스 공유드립니다.// controller @RestController @RequestMapping("/admin/api/v1/companies") class CompanyController( private val getCompanyService: GetCompanyService ) { @GetMapping fun findAll(): List<CompanyResponse> { return getCompanyService.findAll().map { CompanyResponse.of(it) } } } // service @Service @Transactional(readOnly = true) class GetCompanyService( private val companyFindService: CompanyFindService ) { fun findAll(): List<CompanyEntity> { return companyFindService.findAll() } }
-
미해결Practical Testing: 실용적인 테스트 가이드
RestDocs에서의 SpringSecurity Issue
public class FollowControllerDocsTest extends RestDocsSupport { private FollowService followService = mock(FollowService.class); @Override protected Object initController() { return new FollowController(followService); } private final Long loginUserId = 1L; @DisplayName("팔로우 수행 API") @WithUserDetails @Test public void startFollow() throws Exception { // Given StartFollowRequestDto requestDto = StartFollowRequestDto.builder() .followerId(loginUserId) .followingId(123L) .build(); BDDMockito.doReturn(StartFollowResponseDto.success()) .when(followService) .follow(any(StartFollowRequestDto.class)); //when,then mockMvc.perform( post("/api/follow/start-follow") .with(csrf()) .content(objectMapper.writeValueAsString(requestDto)) .contentType(MediaType.APPLICATION_JSON) ) .andExpect(status().isOk()) .andDo(document("start-follow", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields( fieldWithPath("followerId").type(JsonFieldType.STRING) .optional() .description("팔로워 아이디"), fieldWithPath("followingId").type(JsonFieldType.STRING) .optional() .description("팔로잉 아이디") ), responseFields( fieldWithPath("code").type(JsonFieldType.STRING) .description(ResponseCode.SUCCESS), fieldWithPath("message").type(JsonFieldType.STRING) .description(SUCCESS) ) )); } } FollowController@RestController @RequestMapping("/api/follow") @RequiredArgsConstructor public class FollowController { private final FollowService followService; @PostMapping("/start-follow") ResponseEntity<? super StartFollowResponseDto> startFollow( @RequestBody @Valid StartFollowRequestDto requestBody, @AuthenticationPrincipal PrincipalDetails principalDetails ) { Long loginId = principalDetails.getUser().getId(); Long userId = requestBody.getFollowerId(); if (loginId != userId) return StartFollowResponseDto.certificationFail(); ResponseEntity<? super StartFollowResponseDto> response = followService.follow(requestBody); return response; } }RestDocsSupport @ExtendWith(RestDocumentationExtension.class) public abstract class RestDocsSupport { protected MockMvc mockMvc; protected ObjectMapper objectMapper = new ObjectMapper(); private final Long loginUserId = 1L; @BeforeEach void setUp(RestDocumentationContextProvider provider) { User user = mock(User.class); when(user.getId()).thenReturn(loginUserId); PrincipalDetails userDetails = mock(PrincipalDetails.class); when(userDetails.getUser()).thenReturn(user); SecurityContext context = SecurityContextHolder.getContext(); context.setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, null, null)); this.mockMvc = MockMvcBuilders .standaloneSetup(initController()) .apply(MockMvcRestDocumentation.documentationConfiguration(provider)) .build(); System.out.println("beforeEach 수행"); } protected abstract Object initController(); } 안녕하세요. 강의 정말 유익하게 잘 듣고있습니다. 강의를 듣고 restdocs를 작성하던 중 문제가 발생하여 질문을 올립니다.제가 작성한 controller에서는 파라미터로 security.context 안에 있는 PrincipalDetails를 받아옵니다. 그렇지만 테스트에선 그 안에 값이 있는게 아니여서 Mock값을 넣어주어 @WebMvcTest 에서는 문제를 해결해 왔었습니다.문제는 restdocs를 작성하기 위한 테스트 코드에서 발생하였습니다. 이 테스트 코드에는 제가 적용한 PrincipalDetails 몫 이 넣어지지 않는 문제가 있었습니다.제가 생각하기론 SpringSecurity가 올라가지 않아서 그런 것 같은데 해결방법이 있으면 알고싶습니다 !
-
해결됨따라하며 배우는 리액트 테스트 [2023.11 업데이트]
테스트 시간을 단축할 수 있는 방법에 대하여 문의드립니다.
[1] 문의내용(총 2건)Jest의 테스트 시간을 단축할 수 있는 방법Jest의 테스트 시간이 증가하는 원인React 프론트코딩시 jest를 항상 켜두고 작업하는게 좋을까요? [2]현재 상황 안내섹션 2의 "간단한 앱 만들며 테스트"를 실습하고 있습니다.테스트코드의 실행이 저의 경우 3초(최대 5초)가 소요되는 반면, 강의 영상은 길어야 2초 정도로 속도가 차이가 나는거 같습니다. 실제 프로젝트에서 테스트코드의 양이 늘어날수록 비례하여 jest 소요시간이 늘어날 것이고, 개발시간의 장기화등 스케쥴측면에서 문제가 될 수 있지 않을까 싶어 문의를 드립니다.
-
해결됨실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
testing api 아이콘(비커)이 뜨지 않습니다.
강의에서 진행하는 브랜치와 동일한 브랜치에서 진행하고 있습니다.의존성 설치도 모두 진행하였고 vitest도 설치했으며 node 버전도 일치합니다.테스트 코드 작성 완료 후에 이 아이콘을 찾아봤는데 도저히 보이질 않습니다.Github 이슈와 stackoverflow 모두 찾아보면서 해답이 될 만한 내용들을 따라해보았으나 위 아이콘은 도저히 찾을 수 없었습니다.혹시 따로 설정을 하신 건가요??
-
해결됨Practical Testing: 실용적인 테스트 가이드
패키지 구조에 대해서 질문 드리고 싶습니다.
강의 너무 잘들었습니다 강사님 :)도움 너무 많이 되고있습니다“패키지 구조에 대한 질문이라는 글을 읽고서 product 패키지-domain 패키지-service 패키지-repository패키지아니면controller패키지-product패지지service패키지-product패키지어떤게 더 나을지 고민입니당 ㅠ 어떻게 생각하시나요?rest api 서버로 프로젝트를 처음 진행하려고 하는데 어떻게 나눌지를 잘 모르겠어서 검색 키워드나 실무에서는 어떻게 사용하시는지 궁금합니다 ..
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
패키지 의존성을 확인해보는법?
해당 챕터를 들고 궁금한 점이 있어 문의를 남깁니다. 7분를 들어보면 패키지 의존성을 확인해보라는 말이 나오는데 그런 의존성을 파악하는 툴 같은게 있는건가요?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
중첩 라우트
그럼 중첩 라우트는 인클루드 개념 인거겠네요?
-
미해결Practical Testing: 실용적인 테스트 가이드
환경변수 관련되서 여쭤볼게 있습니다~
mock 테스트 중에환경변수(@Value)를 가져와야하는데,@SpringBootTest가 아니라서 환경변수를 못가져오고 있습니다.그래서 환경변수를 담은 변수가 null이 나오기 때문에 테스트를 못하고 있는데, 이럴 경우 어떻게 하시나요??일단 환경변수 대신, 생성자를 통해 해당 변수들을 받는 형태로 리펙토링했는데, 프로덕션 코드들을 테스트에 맞추는 거 같아서 약간 딜레마가 오고있어요.선생님께서는 이런 경우 어떻게 하시나요?1. 환경변수 이슈2. 프로덕션 코드를 테스트코드에 맞추는 리펙토링(2번은 수업에 있네요 ㅎㅎ)