백엔드 Back-end/테스트 Test 13

켄트 벡의 테스트 주도 개발 예제대로 따라해보기

켄트 백의 테스트 주도 개발 책에 나온 예제대로 조금만 따라해보면 테스트 주도 개발을 이해할 수 있다.  준비: IntelliJ IDEA 설치하기먼저 IntelliJ IDEA를 내려받는다.https://www.jetbrains.com/idea/download/?section=mac Community Edition을 내려받으면 공짜로 사용할 수 있다. 실행하면 이런 화면이 나온다. New Project를 누르고 TDD라고 적자. Create을 누르면 이 상태가 된다.  테스트 만들기테스트 주도 개발은 테스트부터 만드는 것이다. 책에 나온 간단한 곱셈 예제는 아래와 같다.    public void testMultiplication(){        Dollar five = new Dollar(5);    ..

Pytest로 InfluxDB 병렬 테스트 시 fixture와 테스트 코드 예시

InfluxDB를 사용한 코드에 대한 테스트 코드를 작성 PostgreSQL이나 MySQL을 테스트할 때 테스트 데이터베이스를 만들어서 하는 것처럼 실제로 InfluxDB에 데이터를 저장하고 읽어서 테스트를 하고 싶었다. 그래야 코드가 정상 작동하는지 확실하게 테스트할 수 있기 때문이다. InfluxDB 관련 테스트 팩키지 X InfluxDB관련 테스트 팩키지가 따로 없었다. 그래서 fixture로 추가해서 사용하기로 했다. fixture 함수 conftest.py 파일에 아래 함수를 추가했다. def use_influxdb(func): if "INFLUXDB_TEST_TOKEN" not in os.environ: return pytest.mark.skip(reason="INFLUXDB_TEST_TOKE..

pytest-BDD(Behavior-driven development) REST API 테스트 픽스처fixture 예

BDD(Behavior-driven development)란? BDD는 한국어로 번역하면 행위 주도 개발로, 소프트웨어 개발 방법론 중 하나다. 소프트웨어 기능을 사용자의 행위 중심으로 설명한다. 예를 들면 아래와 같다. Title: Returns and exchanges go to inventory. As a store owner, I want to add items back to inventory when they are returned or exchanged, so that I can sell them again. Scenario 1: Items returned for refund should be added to inventory. Given that a customer previously bou..

전통적인 개발과 테스트 주도 개발, 그리고 애자일

팀내에서 전통적인 개발과 테스트 주도 개발, 그리고 애자일을 주제로 발표를 했다. 요며칠 밤마다 작업한 결과물이다. 슬라이드쉐어에 발표자료를 올려 놓았다. 긴 문장도 넣었지만, 짧은 문장으로 표현한 것도 있어서 잘 이해가 안 될 수도 있어 발표 설명을 각 장마다 적어 본다. 발표 슬라이드https://www.slideshare.net/taptorestart/ss-258182158   발표 스크립트지금 여기 모인 대부분의 개발자들이 하는 개발 방식은 전통적인 개발에 가깝습니다. 전통적인 개발에서는 기능 구현부터 합니다. 기능을 구현하고, POSTMan 같은 테스트 툴, 웹 등을 활용해서 기능을 구현한 부분을 개발자가 직접 테스트합니다.  그림 속 네모 칸은 기능을 뜻합니다. 이미 구현한 기능이 2개이고, ..

Q. 테스트 주도 개발Test-Driven Development(TDD)란?

A. 켄트 벡이 창시한 개발 방법론으로 테스트부터 작성하는 개발 방법론이다. 먼저 통과하지 못할 테스트를 작성하고 테스트를 통과하도록 코드를 작성한다. 그 뒤 코드를 개선, 리팩터링하고 테스트하는 과정을 반복하는 식이다. 테스트 주도 개발 테스트 주도 개발의 목표 작동하는 깔끔한 코드(clean code that works). 론 제프리즈(Ron Jeffries)의 핵심을 찌르는 이 한마디가 바로 테스트 주도 개발의 궁긍적인 목표다. 출처: 켄트 벡, 「테스트 주도 개발」, 김창준, 강규역 역, (주)도서출판인사이트, 2005, 21p. 테스트 주도 개발의 규칙 테스트 주도 개발에서는 ● 오직 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다. ● 중복을 제거한다 는 두 가지 단순한 규칙만을 따른..

Q. 깃허브 풀리퀘스PullRequest 때 테스트를 자동화하는 방법은?

A. 깃허브GitHub 워크플로우workflows를 활용하면 쉽게 테스트를 자동화할 수 있다. pytest를 실행하는 예 깃허브 저장소에 .github 폴더를 만들고 그 아래 workflows를 만든다. 그리고 아래 내용을 담은 yml 파일을 만든다. 이름은 아무 거나 가능하다. tests.yml로 만들자. name: Test on: pull_request: branches: - main jobs: build: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: '3.6' - run: | python -m pip install --upgrade pip pyth..

테스트 주도 개발이 기능부터 개발하는 것보다 더 빠르고 안정적이다

테스트 주도 개발Test Driven Development(TDD)란? 켄트 벡이 창시한 개발 방법론으로 테스트부터 작성하는 개발 방법론이다. 먼저 통과하지 못할 테스트를 작성하고 테스트를 통과하도록 코드를 작성한다. 그 뒤 코드를 개선, 리팩터링하고 테스트하는 과정을 반복하는 식이다. 리팩터링 책으로 유명한 마틴 파울러가 추천하는 개발방식이다. TDD의 가장 큰 특징은? 테스트 주도란 명칭처럼 테스트부터 작성한다! 기능부터 작성 → 테스트가 아니라, 테스트 → 기능 코드 작성이다. 파이썬을 예를 들면 테스트부터 작성한다. def test_sum() assert sum(1, 2) == 3 당연히 sum 함수 구현이 안 되어 있으니 테스트는 실패한다. 위 테스트가 성공할 때까지 sum함수를 구현하는 식이다..

테스트Test 기반 없는 코드 리뷰Code Review의 비효율성과 위험성

코드 리뷰 코드 리뷰를 하는 리뷰어는 보통 눈으로 변경된 코드를 읽고 자신의 의견을 말한다. 코드 전체가 아니라 바뀐 부분만 주로 본다. 따라서 코드 변경에 따른 의도하지 않은 부작용까지는 생각하기 어렵다. 리뷰어는 의견을 낼 뿐 책임지지 않는다. 책임은 코드 작성자 몫이다. 테스트 기반 없는 코드 리뷰의 비효율성 리뷰어가 제시한 사소한 변경이라도 만에 하나 있을 부작용 확인을 위해 작성자는 매번 테스트를 해야 한다. 테스트가 없는 상태라면 일일이 리뷰어의 의견을 반영할 때마다 관련 코드 전반을 테스트 해야 한다. 리뷰어들이 같은 시간 한꺼번에 리뷰해주면 좋겠지만 A 리뷰어, B리뷰어가 리뷰하는 시간은 다른 경우가 대부분이다. 따라서 리뷰를 받을 때마다 테스트하게 된다. 테스트 기반 없는 코드 리뷰의 위..

Python requests와 pytest로 REST API 서버 테스트하기

자바스크립트 기반인 frisby.js로 REST API 서버 테스트를 할 수도 있지만, 파이썬이 익숙하다면 requests로도 쉽게 구현할 수 있다. 준비: API 서버 실행 우선 FastAPI 예제를 실행한다. 예제코드는 FastAPI - Email Login with Password.. 여기 있다. localhost:8000/docs로 접속했을 때 아래처럼 뜬다면 정상 작동하고 있는 것이다. API 테스트 코드 작성 위에 브라우저로 확인한 것을 그냥 코드로 아래처럼 작성해서 확인할 수도 있다. import requests def test_get_docs(): endpoint = "http://localhost:8000/docs/" response = requests.get(endpoint) asser..

Q. 유명 개발자들은 파이썬 테스트 코드를 어떻게 작성할까?

A. 사례를 찾아보면 진짜 생각보다 간단하게 짠다. 테스트 코드 작성 어렵다. 작성하면서도 이게 과연 올바른가 의심될 때가 있다. 이럴 때는 유명 개발자들은 어떻게 하는지 찾아보는 것만으로도 큰 도움이 된다. 게다가 개발 바닥은 쉽게 찾을 수 있으니! 구글 구글부터 살펴보자. github에서 구글로 들어가서, 언어는 파이썬, 정렬은 별개수로 하자. 목록 상단에 있는 google / jax를 골랐다. 여기 들어가니 tests 디렉터리가 있다! 여러 테스트 파일 중 core_test.py를 보자. tree_flatten이란 함수를 테스트하는 코드는 아래가 다다. 값은 직접 입력했고, 입력한 값은 아주 간단한 것을 볼 수 있다. 10개가 아니라 1개다. def test_tree_flatten(self): fl..

frisby.js로 REST API 서버 테스트 하기

frisby.js란? "Frisby makes REST API testing easy, fast, and fun." - frisby.js 소개에서 "Frisby는 REST API 테스트를 쉽고, 빠르고 재미있게 만든다." REST API 테스트용 라이브러리다. 어떤 언어로 되어 있나? 자바스크립트 기반이고, 테스트를 실행하기 위해서 Jest를 사용한다. 테스트 코드 자체가 반복적이기 때문에 엄청 높은 수준의 자바스크립트 지식을 필요로 하지는 않는다. 자바 기반 스프링부트나 파이썬 기반 장고 등 다른 언어로 API 서버를 개발해도 쉽게 frisby.js로 테스트 코드를 짤 수 있다. 언제 사용하는가? API 서버를 테스트할 때 사용한다. Postman 같은 API 테스트 플랫폼과 같은 용도다. 장점은 코드..

Q. Postman으로 POST해서 생성한 id 받아서 PATCH DELETE 테스트할 수 있을까?

A. 있다. 가능하다. Tests 탭을 눌러서 코드를 입력하면 환경변수에 등록할 수 있다. 코드 예는 아래와 같다. var jsonData = pm.response.json(); pm.environment.set('article_id', jsonData['id']); pm은 포스트맨 객체이고, response는 응답이다. 거기서 json을 jsonData로 저장한 것이고, 새로 생성된 'id'를 받아서 'article_id'로 환경변수에 저장하게 된다. 이 해당 환경변수를 다음 PATCH나 DELETE에 사용하면 된다. 아래처럼 id 입력 자리에 {{article_id}}를 입력하면 환경변수로 저장한 article_id를 불러오게 되고 방금 POST한 데이터를 수정할 수 있게 된다. PATCH http:..