2012-06-11 38 views
6

Tôi đang trong quá trình viết ứng dụng GUI có kích thước trung bình/nhỏ với PyGObject (các ràng buộc dựa trên nội dung mới cho Gtk). Tôi bắt đầu với một bộ thử nghiệm hợp lý dựa trên nose có thể kiểm tra hầu hết các chức năng của ứng dụng của tôi bằng cách nhập các mô-đun và gọi các chức năng khác nhau và kiểm tra kết quả.Có cách nào để kiểm tra đơn vị mã Gtk/GLib được viết bằng Python không?

Tuy nhiên, gần đây tôi đã bắt đầu tận dụng một số tính năng Gtk như GLib.timeout_add_seconds, đây là một cơ chế gọi lại khá đơn giản, chỉ cần gọi lại cuộc gọi được chỉ định sau khi bộ hẹn giờ hết hạn. Vấn đề tôi phải đối mặt bây giờ là mã của tôi có vẻ như để hoạt động khi tôi sử dụng ứng dụng, nhưng testuite bị đóng gói kém nên khi một kiểm tra kiểm tra xem nó bắt đầu với trạng thái sạch, nó phát hiện rằng trạng thái đã bị chà đạp qua một cuộc gọi lại đã được đăng ký bằng một thử nghiệm khác. Cụ thể, kiểm tra thành công kiểm tra rằng không có tệp nào được tải, sau đó nó tải một số tệp, sau đó kiểm tra xem tệp chưa được sửa đổi kể từ khi tải và thử nghiệm không thành công! Tôi đã mất một lúc để tìm ra những gì đang diễn ra, nhưng về cơ bản một thử nghiệm sẽ sửa đổi một số tệp (bắt đầu hẹn giờ) rồi đóng chúng lại mà không lưu, sau đó một thử nghiệm khác sẽ mở lại các tệp chưa sửa đổi và thấy rằng chúng ' tái sửa đổi, bởi vì các cuộc gọi lại thay đổi các tập tin sau khi bộ đếm thời gian đã được lên.

Tôi đã đọc về nội dung tải lại của Python với hy vọng rằng tôi có thể tải và tải lại ứng dụng của mình để bắt đầu mới nhưng có vẻ như nó không hoạt động.

Tôi sợ rằng tôi có thể phải nghỉ mát để khởi chạy ứng dụng dưới dạng tiến trình con, tinkering với nó, sau đó kết thúc tiến trình con và khởi chạy lại khi tôi cần đảm bảo trạng thái mới. Có bất kỳ khuôn khổ thử nghiệm nào ở đó có thể thực hiện điều này dễ dàng, đặc biệt đối với mã pygobject không?

Trả lời

2

Có phải mocking framework giúp bạn tách biệt các cuộc gọi lại không? Bằng cách đó, bạn sẽ có thể quay lại trạng thái giống như khi bạn bắt đầu. Lưu ý rằng một mẫu SetUp() và teardown() có thể giúp bạn ở đó - nhưng tôi giả định rằng bạn đã sử dụng nó.

+0

Tôi không nghĩ rằng chế nhạo là những gì tôi đang tìm kiếm. Tôi có một tập dữ liệu nhỏ mà tôi sử dụng để thử nghiệm và thay thế nó bằng mocks sẽ không thực sự khắc phục sự cố tôi đang gặp phải, đó là mã logic chương trình thực tế sử dụng gọi lại thời gian chậm hoạt động kém trong môi trường kiểm tra nhanh . I * am * sử dụng funcs thiết lập/teardown, nhưng tôi đã không thể viết một teardown thành công mà thực sự có thể dỡ bỏ chương trình từ bộ nhớ và sau đó tải lại nó trong trạng thái mới. Luôn luôn có những cuộc gọi lại gây cản trở cho một thử nghiệm tiếp theo. – robru

+0

Tôi đã nghĩ đến việc chế nhạo các cuộc gọi lại nhưng điều đó có thể hoặc có thể không phù hợp với nhu cầu của bạn. – Sardathrion

+0

Những gì tôi đã làm bây giờ mà có vẻ là làm việc là chỉ cần gọi thủ công gọi lại từ thử nghiệm, và sau đó là một chút tích cực hơn về việc xóa các cuộc gọi lại với 'GLib.source_remove', và nó có vẻ là làm việc. Cảm ơn mặc dù. – robru

Các vấn đề liên quan