August 08, 2021
지난주부터 이어서 Cypress 테스트 작업을 해 보았다. 지금은 연습 겸 해서 짜는 거지만, 실제 프로덕션에서 쓰게 된다면, 테스트 하기 쉬운 기능 개발
에 대해 많은 고민을 할 것 같다. 예를 들면 Component Props
만 생각해봐도,
type Props = {
onClick: () => void
text: string
className: string
}
const Button = ({ onClick, text, className }: Props) => {
return (
<button onClick={onClick} className={className}>
{text}
</button>
)
})
...
<Button
text="안녕"
onClick={() => console.log('안녕')}
// ????
// data-testid="button-test"
// style={{ color: 'skyblue' }}
/>
이렇게 써버리면, Props에 명시되지 않은 값들이 무시되어 버리게 경우가 발생해버린다. 처음에는 저런 값들도 다 Props로 내려줘야 하나?
싶어서 기존 컴포넌트들을 많이 수정해야하는 딜레마에 빠져있었는데,
BPL(Banksalad Product Language) 무야호
이걸 보면서 개선해 나갈 수 있었다.
export interface HtmlElementProps<T extends HTMLElement>
extends Omit<React.HTMLAttributes<T>, 'id'> {
'data-testid'?: string
}
type Props = {
text: string
} & HtmlElementProps
const Button = ({ text, ...props }: Props) => {
return (
<button {...props} >
{text}
</button>
)
})
...
<Button
text="안녕"
onClick={() => console.log("안녕")}
data-testid="button-test"
style={{ color: 'skyblue' }}
>
<img src="icon.png" alt="아이콘 이미지" />
</button>
cy.intercept
을 통해 요청을 가로챌 수는 있지만, 막상 log를 찍어보면 devtools나 sentry에 찍힌것보다 꽤 차이가 나는 값을 찍고 있어서 신뢰할 수 없던게 큰 이유였다. 애시당초 그러한 목적으로 Cypress를 쓰는것도 아니였기에, 어느정도 삽질을 하다가 정리하는게 나을것 같다는 판단이 들었다.Api response를 받은 후 화면에 그려준다.
라는 테스트를 할 때가 가장 애매했다. API response를 받은 후 화면에 보여줘야 하는데, 화면에 다 나온것을 어떤 기준으로 하지?
에서 많은 고민을 했다. 우선은 No Data
화면과 list
화면 분기처리, 그리고 list
의 n번째 row의 className이 있는지 확인하는 식으로 처리를 했는데, 더 좋은 방법이 있을지 고민해봐야겠다. list의 수가 모잘라서 n번째까지 안올 경우에는 현재의 테스트가 실패할 것이기 떄문이다. 음… 중간에 intercept
하는 부분에서 list의 갯수를 파악하고, n - 1 번째 row
가 있는지 확인하는것도 방법이 될 수 있겠다.