2017-02-05 15 views
7

Khi chạy thử nghiệm trong các ứng dụng Django sử dụng các tác vụ Celery, tôi không thể kiểm tra đầy đủ các nhiệm vụ cần lấy dữ liệu từ cơ sở dữ liệu vì chúng không kết nối với cơ sở dữ liệu thử nghiệm. tạo ra.Làm cho Celery sử dụng cơ sở dữ liệu thử nghiệm của Django mà không cần task_always_eager

Đặt task_always_eager trong cần tây để True giải quyết một phần vấn đề này nhưng như documentation for testing cho biết, điều này không phản ánh đầy đủ cách mã sẽ chạy trên công nhân thực sự của Celery và không phù hợp để thử nghiệm.

Làm cách nào để có thể thực hiện tác vụ Celery sử dụng cơ sở dữ liệu thử nghiệm Django khi chạy thử nghiệm Django mà không cần đặt task_always_eager = True?

Trả lời

8

ngắn = Bạn phải chạy công nhân cần tây như trong sản xuất

dễ dàng:

  1. Sử dụng chuyên dụng db thử nghiệm (như trong sản xuất)
  2. Configure cần tây để sử dụng nó
  3. Bắt đầu công nhân cần tây bằng tay trước khi bạn chạy thử nghiệm

Nâng cao:

  1. Sử dụng tự động tạo thử nghiệm db (nó có thể là sqlite)
  2. Run nhân cần tây trong thiết lập thử nghiệm của bạn()
  3. Configure cần tây để sử dụng tự động tạo thử nghiệm db (sao chép django.conf.settings.DATABASE từ thử nghiệm quy trình cần tây)

Và luôn luôn bạn phải cung cấp cho người môi giới thư cho cần tây.

Tôi có một bài kiểm tra đó đòi hỏi người lao động cần tây chuyên dụng để kiểm tra mã của tôi trôi qua tin nhắn giữa nhiệm vụ cần tây và mã gọi: https://gist.github.com/Sovetnikov/a7ad982fc77e8dfbc528bfc20fcf3b1e mô-đun python Đây là hai trong một - một TestUnit và cần tây nhân Á hậu với cấu hình khép kín.

Mã của tôi không sử dụng bất kỳ db nào, nhưng bạn có thể dễ dàng điều chỉnh nó theo nhu cầu của mình. Chỉ cần vượt qua django.conf.settings.DATABASE (như json hoặc dưa hoặc bất cứ điều gì bạn thích phương pháp) để mã khởi động cần tây và cấu hình Django DATABASE để trỏ đến thử nghiệm db.

thông tin bổ sung:

  1. Có giải pháp hoàn chỉnh cho trường hợp này https://github.com/RentMethod/celerytest (tôi đã cố gắng một số phiên bản cũ của nó và không có may mắn vì nó sử dụng chủ đề, với python GIL ... và tôi nghĩ rằng đó là quá phức tạp)

  2. mẫu mã, làm thế nào để cấu hình cài đặt DATABASE và init django chính nó trong module đơn https://gist.github.com/Sovetnikov/369a8d05ba2b6482fa20769bc498f122

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