🏗️ Automation Testing · Chương 13 · Mục 13.2
Tách api_client.py
Tạo thư mục utils, file utils/api_client.py:
FILE utils/api_client.py
"""Client goi API Restful-Booker - gom cac ham dung lai nhieu lan, thay vi lap coderequest/header o tung file test. Tach ra sau khi Checkpoint 4-5 da viet du test vathay ro cho lap lai o dau (dung Phuong an B: don gian truoc, nang cap sau khi co ly do)."""class RestfulBookerClient:"""Boc 1 lop mong quanh APIRequestContext cua Playwright.Tap trung duong dan endpoint va cach gan token vao header Cookie mot cho duy nhat,de sau nay API doi cach xac thuc thi chi phai sua o day, khong phai sua tung test."""def __init__(self, api_context, token=None):"""Luu APIRequestContext dung chung va token (neu co) de gan vao header Cookie."""self._api = api_contextself._token = tokendef _auth_headers(self):"""Tra ve header Cookie chua token - rong neu client nay khong co token."""return {"Cookie": f"token={self._token}"} if self._token else {} # ternary: co token thi tra dict Cookie, khong thi tra dict rongdef dang_nhap(self, username, password):"""POST /auth - tra nguyen response de test tu kiem tra status/body."""return self._api.post("/auth", data={"username": username, "password": password})def lay_danh_sach_booking(self, **bo_loc):"""GET /booking, co the truyen filter vd firstname=.., lastname=.."""# **bo_loc: gom moi keyword argument goi ham (vd firstname="An") thanh 1 dict de truyen thang lam query paramsreturn self._api.get("/booking", params=bo_loc)def lay_chi_tiet_booking(self, bookingid):"""GET /booking/{id}."""return self._api.get(f"/booking/{bookingid}")def tao_booking(self, du_lieu):"""POST /booking - khong can token."""return self._api.post("/booking", data=du_lieu)def sua_toan_bo_booking(self, bookingid, du_lieu):"""PUT /booking/{id} - can token, tu dong gan header Cookie."""return self._api.put(f"/booking/{bookingid}", data=du_lieu, headers=self._auth_headers())def sua_1_phan_booking(self, bookingid, du_lieu):"""PATCH /booking/{id} - can token."""return self._api.patch(f"/booking/{bookingid}", data=du_lieu, headers=self._auth_headers())def xoa_booking(self, bookingid):"""DELETE /booking/{id} - can token."""return self._api.delete(f"/booking/{bookingid}", headers=self._auth_headers())
Đây là 1 class — kiểu tổ chức code gói cả dữ liệu (self._api, self._token) và hành vi (các hàm sua_toan_bo_booking...) vào 1 chỗ. _ đứng đầu tên hàm/biến (_api, _auth_headers) là quy ước Python báo "hàm/biến nội bộ, không dùng từ bên ngoài class".
Thư mục utils cần có file rỗng __init__.py để Python nhận đây là 1 gói (package) import được.