본문 바로가기
반응형

TEST CODE9

2. 좋은 함수 만들기 - 암묵적 입력/출력 지난 시간에 부작용 (부수효과) 함수에서 어떻게 최대한 부작용과 거리두기를 해서 좋은 함수를 만드는지 간단한 예제로 연습해봤다. 이번 시간에는 좋은 함수가 되기 위해 관리해야할 부작용이란 어떤 것들이 있는지 알아보자. 1. 암묵적 입력/출력 좋은 함수는 "부작용 (부수효과) 이 없으며, 멱등성을 유지할 수 있는 함수" 라고 했다. 이 부작용 (부수효과) 함수에는 크게 2가지 특징이 있다. 암묵적 입력 (implicit input) 암묵적 출력 (implicit output) 1-1. 암묵적 입력 (implicit input) 암묵적 입력이란 함수의 입력값으로 명시적으로 전달되지 않는 파라미터를 의미한다. 예를 들자면 다음과 같은 경우 암묵적 입력이다. 함수의 인자는 없는데 함수 내부에서 쿠키에서 값을 가.. 2023. 3. 1.
단언문 (expect/assert) 안에서 비교하지 않기 간혹 코드를 보면 expect 에서 비교를 하는 코드를 보곤 한다. 이를테면 다음과 같은 경우이다. it('getCount의 결과는 5보다 크다', () => { const result = getCount(); expect(result > 5).toBe(true); }); 당장 봐서는 문제가 없어보인다. 오히려 비교값이 더 큰지 검증하는 jest 함수를 별도로 찾아보지 않아도 된다는 장점도 있어보인다. 비슷한 예제로 다음과 같은 코드도 종종 보게 된다. it('getCount의 값은 10과 동일하다', () => { const count = getCount(); expect(count === 10).toBe(true); }); 하지만 이 테스트 코드들은 크게 2개의 단점을 갖고 있다. (정확히는 잘못된 .. 2022. 4. 10.
테스트코드에서 Optional chaining(?.) 쓰지않기 여러 포스팅에서 언급한것처럼 테스트 코드는 빠르게 실패를 파악할 수 있어야 한다. 그런면에서 Optional chaining(?.) 은 테스트코드에 적합하지 않다. MDN의 설명을 가져오면 Optional chaining(?.)은 체이닝 연산자(.) 와 유사하게 작동하지만, 만약 참조가 nullish (null 또는 undefined)이라면, 에러가 발생하는 것 대신에 표현식의 리턴 값을 undefined로 반환한다. 따라서 참조가 누락될 가능성이 있는 경우 연결된 속성으로 접근할 때 더 짧고 간단한 표현식이 생성된다. 어떤 속성이 필요한지에 대한 보증이 확실하지 않는 경우 객체의 내용을 탐색하는 동안 도움이 될 수 있다. 안정적으로 객체 탐색이 가능하기 때문에 프로덕션 코드에서는 적극적으로 사용하는 편.. 2022. 3. 8.
조건부 (if~else) 로직 테스트코드에서 사용하지 않기 테스트 코드는 프로젝트의 생명 주기 보다 길때가 많다. 기존의 요구사항을 정리한것이 테스트 코드이기 때문에, 메인 코드보다 훨씬 더 읽기쉬워야만 한다. 만약 테스트 코드가 복잡한 경우 어떻게 작동하는지 이해하기가 어렵다. 그래서 테스트 코드는 주석이 필요 없을 정도로 간단해야 한다. 그런면에서 조건부 (if ~ else) 테스트 로직은 테스트를 실제보다 더 복잡하게 만드는 요인 중 하나다. 이번 글에서는 조건부 로직을 테스트에서 사용한 경우에 어떻게 개선할 수 있을지 알아본다. 1. 가변 결과를 검증하는 경우 1-1. 문제 첫번째 문제는 다음과 같이 테스트 실행때마다 결과가 달라지는 경우이다. it('[Bad] 가변결과 검증', () => { const now = LocalDateTime.now(); c.. 2022. 3. 7.
메일 내용 단위 테스트 하기 1. 문제 서비스를 개발하다보면 특정 포맷으로 이메일을 보내거나, 문자등을 보내는 기능을 구현할때가 있다. 이를 테면 다음과 같은 경우이다. 메일/카카오톡/문자 등으로 보내는 템플릿 내용 SQS와 같은 메세지큐에 보내는 메세지 내용 비지니스 담당자가 봐야하는 로그 이런 경우 보통 메세지 내용을 검증하기가 상당히 어렵다 예를 들어 다음과 같은 sendMail 코드가 있다면 @Injectable() export class AdminService { constructor( private readonly mailerService: MailerService, private readonly htmlTemplate: HtmlTemplate, ) {} async sendMail( email: string, filePa.. 2021. 12. 5.
[Typescript] 1. TypeORM에서 페이징 API 만들기 - 기본페이징 기능 웹 서비스를 구현하는 과정에서 페이징 API는 가장 기본적인 기능인데요. Java 기반의 페이징 구현 코드는 많은데, Typescript 와 TypeORM 의 구현 코드가 많지 않아 작성하게 되었습니다. 현재 Typescript 와 TypeORM 스펙으로 웹 서비스를 구현하신다면 한번쯤 참고해보셔도 좋을것 같습니다. 전체 코드는 Github에 있습니다. 여기서는 기본적인 페이징에 대해서만 소개 드리는데요. 고성능의 페이징 API가 필요하다면 이전의 포스팅들을 참고해주세요. 1. NoOffset 사용하기 2. 커버링 인덱스 사용하기 3-1. 페이지 건수 고정하기 3-2. 첫 페이지 조회 결과 cache 하기 1. 프로젝트 구조 사용된 대표적인 패키지는 다음과 같습니다. Typescript TypeDI DI.. 2021. 6. 10.

728x90
반응형