본문 바로가기

개발40

[pytest] 파이썬 api 테스트 1. UI test / End-to-End test : UI에 직접 입력하고 기능이 정상 작동하는지, 화면에 정상으로 출력되는지 테스트해 보는 방식. 실제 서비스 사용과 같이 테스트할 수 있다. 하지만 시간이 많이 소요되고 모든 시스템을 실행 시키고 연결해야 테스트가 가능하다. Selenium 같은 UI 테스트 프레임워크로 어느 정도 자동화 가능하지만 완벽한 자동화엔 어려움이 있다. 2. Integration test : 테스트하고자 하는 시스템을 실행시켜 실행하는 테스트. 하나의 시스템만 테스트하므로 UI 테스트에 비해 실행 시간과 설정이 간단하고, UI 요소가 없는 시스템의 경우 테스트하기 용이하다. 3. Unit test : 시스템을 실행하여 테스트하기보다 코드를 직접 테스트하는 개념. 함수등 시스.. 2023. 8. 30.
[python] 정규표현식 phone_format = r'^[0][0-9]{9,10}$' delete_hyphen_phone = re.sub('[-]', '', delivery_info['phone']) print(check_valid_input(delete_hyphen_phone, phone_format)) def check_valid_input(inp, format): if re.match(format, inp): return True print(inp, format) return False 꽤 오래 전에 작성한 코드였는데, 코드 살펴보다가 생각나서 올린다. phone_format : r을 앞에 붙여 만든 정규표현식 delete_hyphen_phone : 하이푼을 빈 문자열로 대체한 결과값. - re.sub함수를 이용한, 정규.. 2023. 8. 28.
relationship class OrderTicket(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False) ticket_id = db.Column(db.Integer, db.ForeignKey('ticket.id', ondelete='CASCADE'), primary_key=True, nullable=False) ticket = db.relationship('Ticket', back_populates='order_ticket') user_id = db.Column(db.String(36), db.ForeignKey('user.id', ondelete='CASCADE'), nullable=False) user = db.. 2023. 8. 28.
[Flask] traceback 에러가 발생하면 콘솔에 아래와 같은 출력이 되는 경우가 가끔 있다. traceback이라는 모듈을 사용하면 이것을 문자열 형태로 그대로 다룰 수 있게 된다. 에러가 발생했을 때, 그 부분을 핸들링하는 부분에서 traceback.format_exc()라는 함수를 실행시키면 위의 문자열을 그대로 리턴하게 된다. 나는 이전 포스팅에서 작성한 모더레이터를 이용하여 에러 traceback을 출력해보았다. 간단하죠? 참고로 traceback.print_exc()라는 함수를 사용하면 바로 출력할 수 있게끔 할 수 있다. 이것을 logger.info를 사용해서 로그 파일에 넣을 수도 있다. 2023. 8. 21.
[Flask] api 에러 핸들러 실제로 백엔드 구현 시, 에러를 굉장히 많이 마주칠 수 있다. 그럴 때 마다 각각의 에러를 처리하기에는 코드도 지저분해지고, 매번 처리해주어야해서 귀찮은 점이 많다. 또한 에러를 일관되게 처리를 못하게 된다. 이를 위해 app.errorhandler라는 데코레이터를 사용하면 된다. api가 실행중일 때 발생한 에러를 처리해주는 데코레이터이다. 사용방법은 아주 간단하다. 이런 데코레이터 하나를 작성해주면 된다. 그렇게 되면 위의 api를 실행하더라도 이와 같은 출력을 낸다. 즉, 에러를 잘 핸들링 한 후에 서버에러를 리턴하는 것 까지 가능하다는 것이다. 데코레이터의 파라미터로 Exception을 주면 모든 예외를 처리하게 되지만, 에러 이름을 넣게 된다면 그 에러만 처리하게 된다. 이렇게 작성한다면, ha.. 2023. 8. 21.
[flask] 로그 출력 에러가 났을 경우 로그를 출력하는 방법을 소개하고자 한다. dictConfig라는 것을 사용하면 된다. import logging from logging.config import dictConfig logging_config = { 'version': 1, 'formatters': { 'simple': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s' } }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'level': 'DEBUG', 'formatter': 'simple', 'stream': 'ext://sys.stdout' }, 'file': { 'class': 'lo.. 2023. 8. 21.
[sql, sqlalchemy] 연결된 두 테이블 cascade 설정하기 - 2 (uselist 설정) 지난 글에서 문제점이 있었다. class Announcement(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(50), nullable=False) content = db.Column(db.Text, nullable=True) class AnnouncementUrl(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) announcement_id = db.Column(db.Integer, db.ForeignKey('announcement.id', ondelete='CASCADE'), n.. 2023. 8. 10.
[sql, sqlalchemy] 연결된 두 테이블 cascade 설정하기 유저테이블이랑, 게시글 테이블이 있다고 가정해보자. 게시글 테이블은 id, user_id, content로 이루어져있다고 가정하자. 아무 설정도 하지 않는다면 user를 삭제하려고 한다면 아마 삭제되지 않을 것이다. 이는 user테이블과 연결된 게시글 테이블에 아직 데이터가 남아있기 때문이다. 이럴 때 어떻게 해라 라고 제약조건을 걸 수 있다. CASCADE 제약조건에 대해 알아보자. on delete, on update에 설정할 수 있는 제약조건이 여럿 있다. 이 중 restrict, set null, set default는 이름만 봐도 대충 알 수 있을 것이다. 하지만 우리는 cascade를 사용할 것이다. 이게 뭘까? 1. RESTRICT : 개체를 변경/삭제할 때 다른 개체가 변경/삭제할 개체를 .. 2023. 8. 7.
[sql, sqlalchemy] 특정 조건으로 order_by 정렬하기 - case문 데이터를 정렬시키는 코드를 짜다가, 정수 크기순, 혹은 역순 등으로 정렬하는게 아니라, 어떤 문자열일 땐 맨 위로, 어떤건 아래로 가게끔 정렬을 해야할 일이 생겼다. 아래는 요구 조건이다. 유저가 받은 알림들을 타입이 '공지'인 알림을 맨 위로 올리고, 나머지는 그 아래 위치시킨다. 또한, 시간 역순으로 정렬한다. 시간 역순으로 정렬하는 것은, order by created_at DESC 로 작성하면 쉽게 짤 수 있었다. ORDER BY created_at DESC 이는 flask의 sqlalchemy로는 아래와 같이 짤 수 있다. Table.query.order_by(Table.created_at.desc()) 하지만, 공지인 것만을 맨 위로 올리는건 쉽지 않았다. 구글링좀 해보니 case문을 사용하면.. 2023. 8. 3.