tests/

제작한 모듈들을 unit test하는 부분입니다.

/tests

/__init__.py

__init__은 특정 클래스나 폴더 혹은 모듈이 호출될떄 함께 호출되고 실행되며, 패키지로 인식하게 해준다.

python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

/make_fake_data.py

테스트에 필요한 가짜 데이터를 생성하는 모듈이다. http 메소드, 포트, pkuserid, pkuserpw의 가짜 데이터를 랜덤으로 생성한다.

from faker import Faker
from faker.providers import internet
import string

# api에 테스트 해보기 위한 데이터 생성 부분입니다.
# 어떤 필요한 데이터들을 생성해서 test를 해볼 것인가?를 주된 관점으로 작성해보았습니다.
# 서버에 대한 API 요청을 테스트 해볼 것이기에, 이에 필요한 요소들을 정리해보겠습니다.
"""
클라이언트 => 서버에 대한 요청 자체에 대한 Test입니다. 
서버 => LMS서버에 대한 요청이 아닙니다...?
1. 파라메타 (GET, POST, PUT, DELETE 4개)
2. uri 에서 url을 뺀 부분 ( path 부분 ) # 제 서버로 보내야 의미가 있다고 생각했습니다., path부분의 임의의 문자로 지정하지 않은 이유는 fake에서 제공하는 path를 이용하고 싶어서 입니다.
4. port 번호
3. 2번에서 추출한 값을 http://localhost:포트번호/path 로 지정하고, 이 uri들을 저장
5. 3번에서 저장한 값을 GET, POST, PUT, DELETE에 맞게 요청이 올바른지 에 대한 TDD 진행

ex) http://localhost:80/login 으로 POST요청이 200이면 이건 잘못됐습니다. 로 하고 나머지는  전부 400 Bad Request로 처리가 되는지 확인하는 코드입니다. header, parameter등의 요소는 처리하지 않았습니다.

클라이언트 -> 서버 form data 부분은 따로 빼서 문법체크만 할 것입니다.
"""


def get_fake():
    fake = Faker("ko_KR")
    fake.add_provider(internet)
    return fake


def fake_request_data(fake_cnt):
    fake = get_fake()

    temp_uri = fake.uri()
    path = ""
    true_path = "/login"
    true_method = "POST"
    true_status = 400
    special_chr = "[-=+,#/\?:^$.@*\"※~&%ㆍ!‘|\(\)\[\]\<\>`']"

    for i in range(len(temp_uri) - 1, -1, -1):
        try:
            path += temp_uri[i] if temp_uri[i] != "/" else 1
        except:
            path = path[::-1]
            break

    request_data_result = [
        {
            "uri": "http://localhost:" + str(80) + true_path,
            "method": true_method,
            "status_code": true_status,
            "form_data_result": {
                "pk_user_id": fake.numerify(text="#########"),  # 9글자 숫자
                "pk_user_pw": fake.numerify(text="#")
                + fake.lexify(
                    text="????"
                    + "?"
                    * (fake.random_int(min=5, max=11) * fake.random_int(min=0, max=1)),
                    letters=(string.ascii_letters + string.digits + special_chr),
                )
                + fake.lexify(text="?", letters=special_chr),
            },  # id는 9글자, 비밀번호는 6자리 숫자(asd) 숫자 특수문자 포함 10자리 이상혹은 최대 16자리 , 첫 데이터는 통과하는 데이터 넣을거라, 항상 숫자 1 특수문자 1 을 포함하도록 하였음.
            "status_code": "200",
        }
        for _ in range(fake_cnt) 
    ]

    return request_data_result

print(fake_request_data(1))
print(len(fake_request_data(1)))
# form_data_result는 서버 -> lms에도 이용하니까 따로 빼둬야하지 않을까 ? 아니면 요청 하나하나에 힘을 실어야하기에 ㅇㅇ

위 같이 가짜 데이터가 생성된 것을 알 수 있다 이를 활용해 이제 test 코드를 작성하면 된다.

/test_api.py

api를 테스트하는 모듈이다.

"""
test_login_checker Test Case
"""
import sys, os
import json
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))) #app을 import 하기 위함


from app import create_app
from config import config_dict

import unittest
from make_fake_data import fake_request_data


class MyTest(unittest.TestCase):

    def setUp(self):
        self.app = create_app(config_dict['testing'])
        self.client = self.app.test_client()

  
    def test_login_fail(self):
        print("\n>>>>가짜 데이터를 생성하고, login_api를 검증해봅니다<<<< \n")
        print(">>>생성할 가짜 데이터의 갯수를 입력해주세요 : ")
        cnt = int(input())
        print("\n")
        fake_data = fake_request_data(cnt)

        for index in range(cnt):
            resp = self.client.post(
                fake_data[index]['path'],
                data = json.dumps(dict(
                fake_data[index]['form_data_result']
                )), 
                content_type = 'application/json', 
                follow_redirects = True)
            
            format_resp = json.loads(resp.data.decode('utf-8'))
            print("테스트 데이터 : ", fake_data[index]['form_data_result'])
            print("응답 데이터 : ", format_resp)


            self.assertEqual(format_resp['status'],  fake_data[index]['status_code'])
            print(">>>검증 완료<<< \n")
    
    # def test_login_sucess(self):

테스트 완료된 화면이다.

안되는 응답에 대해서만 처리를 하였는데, api가 정상작동하는 코드는 학번 ID 와 PW 가 그대로 코드에 적혀야하므로, 나중에 test_id를 만들어 테스트 코드를 제작할 예정이다.

Last updated