NX Lab

Giả lập (mock) module NXOpen để kiểm thử code có gọi API mà không cần mở NX

#Python#Kiểm thử#Mock1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Ngay cả hàm gọi API NX Open vẫn test được ngoài NX nếu bạn thay NXOpen bằng đối tượng giả. Cách này bắt được phần lớn lỗi lập luận (sai điều kiện, thiếu kiểm tra None) trước khi chạy thật.

    Giả lập (mock) module NXOpen để kiểm thử… Giả lập (mock) module NXOpen để kiểm thử…

    Các bước thực hiện

    1. Tạo module NXOpen giả. Chèn vào sys.modules trước khi import code cần test.
    2. Dựng đối tượng giả. unittest.mock.MagicMock với thuộc tính cần dùng.
    3. Viết test. Gọi hàm với part giả, kiểm tra kết quả.
    4. Kiểm tra lời gọi. assert_called_with để chắc gọi đúng API.
    5. Giữ mock nhỏ. Chỉ mô phỏng những gì thật sự dùng.

    Code tham khảo (Python)

    import sys
    import types
    import unittest
    from unittest import mock
    
    # 1) Tạo NXOpen giả trước khi import code của bạn
    nxopen_gia = types.ModuleType("NXOpen")
    nxopen_gia.Session = mock.MagicMock()
    sys.modules["NXOpen"] = nxopen_gia
    
    # 2) Code cần test (thường nằm trong file riêng và được import sau bước 1)
    def kiem_tra_part(part):
        if part is None:
            return False, "Chưa có Work Part"
        if part.IsReadOnly:
            return False, "Part chỉ đọc"
        return True, ""
    
    def dem_body_dac(part):
        return sum(1 for b in part.Bodies if b.IsSolidBody)
    
    # 3) Test
    class TestVoiNXGia(unittest.TestCase):
        def test_part_none(self):
            ok, ly_do = kiem_tra_part(None)
            self.assertFalse(ok)
            self.assertIn("Work Part", ly_do)
    
        def test_part_chi_doc(self):
            part = mock.MagicMock(IsReadOnly=True)
            self.assertEqual(kiem_tra_part(part), (False, "Part chỉ đọc"))
    
        def test_dem_body(self):
            solid, sheet = mock.MagicMock(IsSolidBody=True), mock.MagicMock(IsSolidBody=False)
            part = mock.MagicMock()
            part.Bodies = [solid, solid, sheet]
            self.assertEqual(dem_body_dac(part), 2)
    
    if __name__ == "__main__":
        unittest.main()
    

    Giải thích code

    • sys.modules["NXOpen"] đặt trước khi import khiến mọi import NXOpen nhận module giả.
    • MagicMock(IsReadOnly=True) tạo đối tượng có sẵn thuộc tính; thuộc tính khác tự sinh khi truy cập.
    • Test không gọi NX thật nên chạy trong mili-giây và không tốn giấy phép.

    Lỗi thường gặp

    • Mock quá nhiều làm test chỉ kiểm tra chính mock; ưu tiên viết hàm thuần nhận dữ liệu đơn giản.
    • Mock không phát hiện lỗi tên API sai; vì vậy cần chạy thêm công cụ đối chiếu tên với NXOpen.dll hoặc test trong NX.

    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.