
Test hồi quy bằng 'golden file': lưu kết quả chuẩn ra JSON và so sánh sau mỗi lần sửa code
#Python#Kiểm thử1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Với phép tính phức tạp (thống kê hình học, khối lượng) khó viết kỳ vọng bằng tay, hãy lưu kết quả đã được kiểm tra làm 'golden file' rồi so sánh các lần chạy sau. Khác biệt chính là tín hiệu cần xem xét.
Test hồi quy bằng 'golden file'Các bước thực hiện
- Chạy lần đầu. Sinh kết quả cho tập part mẫu.
- Xem xét thủ công. Kiểm tra kết quả đúng rồi lưu thành golden.
- Chạy lại sau khi sửa. Sinh kết quả mới.
- So sánh. Báo các khóa khác nhau có dung sai.
- Cập nhật golden khi thay đổi là chủ ý. Qua tùy chọn --cap-nhat.
Code tham khảo (Python)
import json import os import sys import NXOpen THU_MUC_MAU = "D:/NXLab/mau" FILE_GOLDEN = "D:/NXLab/tests/golden.json" def do_mot_part(session, duong_dan): part, st = session.Parts.Open(duong_dan) st.Dispose() try: bodies = [b for b in part.Bodies if b.IsSolidBody] return { "so_body": len(bodies), "so_mat": sum(len(b.GetFaces()) for b in bodies), "so_canh": sum(len(b.GetEdges()) for b in bodies), "so_feature": sum(1 for _ in part.Features), } finally: part.Close(NXOpen.BasePart.CloseWholeTree.FalseValue, NXOpen.BasePart.CloseModified.CloseModified, None) def thu_thap(session): kq = {} for ten in sorted(os.listdir(THU_MUC_MAU)): if ten.lower().endswith(".prt"): kq[ten] = do_mot_part(session, THU_MUC_MAU + "/" + ten) return kq def so_sanh(cu, moi): khac = [] for part, tt in moi.items(): if part not in cu: khac.append("Part mới chưa có trong golden: " + part) continue for k, v in tt.items(): if cu[part].get(k) != v: khac.append("%s.%s: golden %r, hiện tại %r" % (part, k, cu[part].get(k), v)) for part in cu: if part not in moi: khac.append("Part có trong golden nhưng không còn: " + part) return khac def main(): session = NXOpen.Session.GetSession() lw = session.ListingWindow lw.Open() moi = thu_thap(session) cap_nhat = "--cap-nhat" in sys.argv if cap_nhat or not os.path.isfile(FILE_GOLDEN): os.makedirs(os.path.dirname(FILE_GOLDEN), exist_ok=True) with open(FILE_GOLDEN, "w", encoding="utf-8") as f: json.dump(moi, f, ensure_ascii=False, indent=2, sort_keys=True) lw.WriteLine("Đã ghi golden mới: " + FILE_GOLDEN) return with open(FILE_GOLDEN, "r", encoding="utf-8") as f: cu = json.load(f) khac = so_sanh(cu, moi) lw.WriteLine("KẾT QUẢ: " + ("KHÔNG ĐỔI" if not khac else "%d khác biệt" % len(khac))) for k in khac: lw.WriteLine(" " + k) if __name__ == "__main__": main()Giải thích code
sort_keys=Truelàm file golden ổn định thứ tự khóa, nên diff trong Git gọn.- Golden ghi số liệu rời rạc (đếm mặt, cạnh, feature), bền hơn số thực dễ dao động nhẹ.
- Tùy chọn
--cap-nhatchỉ dùng khi bạn cố ý thay đổi hành vi.
Lỗi thường gặp
- Cập nhật golden mà không xem lại kết quả làm mất ý nghĩa của test; luôn xem diff trước khi chấp nhận.
- Số thực nên so sánh có dung sai; ở ví dụ này dùng số nguyên nên so sánh trực tiếp.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.