Thursday, 14 April 2016

[python] test python đơn giản như giật một sợi tox

Bài viết tiếp theo của "Người ta test/CI thế nào?"
...

Là một sysadmin, anh Chuối rất tự hào mình có khả năng viết Python giỏi như viết bash.
Hễ khi cần viết script ngắn ngắn, anh lại bật ngay vim lên và viết từng dòng thơ bằng ngôn ngữ bash, sau đó dành nửa ngày còn lại để debug tại sao nó lại không chạy. Câu chuyện cũng vậy mỗi lần anh Chuối viết script để tự động quá trình test, build phần mềm, cụ thể ở đây là một Python module.

Các bước phải làm:
  • đầu tiên là tạo virtualenv
  • rồi source virtualenv
  • chạy pip install -r requirements.txt
  • chạy flake8 kiểm tra lỗi pep-0008
  • chạy pylint kiểm tra lỗi lint 
  • install module (python setup.py install) rồi chạy test
  • chạy test bằng py.test tests/ hoặc một cách nào đó khác
  • public package nếu test thành công (python setup.py sdist)
  • dọn dẹp, rửa ráy sau khi xong xuôi.
Tuỳ thuộc vào tâm trạng của anh Chuối, công việc này có thể suôn sẻ hoặc không, tuỳ giời nữa.
Vậy một ngày anh Chuối sang tây, thấy mấy anh Chuối tây vì làm việc này nhiều quá, nên sinh chán nản, và đẻ ra một cái tool có tên là "tox".



tox giúp tự động và chuẩn hoá tất cả các quy trình nói trên, mà không cần dùng đến một dòng bash nào. Mọi yêu cầu được viết vào một file tox.ini thân thiện với mọi người. Không chỉ vậy, tox còn có khả năng test chương trình với nhiều phiên bản python, nhiều môi trường, config khác nhau.
Về mặt bản chất, tox là công cụ để quản lý các virtualenv, nó tự sinh tự diệt virtualenv, tự chạy test trong từng môi trường và cũng là một commandline tool để chạy test.

Thấy hay, anh Chuối liền ăn trộm mang về, Việt hoá cái tên thành "Tốc", rồi mang đi khoe công nghệ hàng đầu thế giới. Từ đây, mỗi lần cần viết quá trình test python tự động, anh Chuối lại viết file tox.ini, rồi cứ thế ngồi hô thần chú: tốc tốc tốc ...vậy là xong.

Thế nhưng thấy hay, trộm về dùng, nào đâu những người xung quanh đã tin. Vậy là lại phải ngồi hì hụi liệt kê ra có những ai hàng đầu, mà dùng "tox":
- Flask
- Ansible
- Bottle
- Youtube-dl
- Scrapy
- httpie
- the fuck
- letsencrypt
...

Thế là cũng đã đủ dài và đủ để dùng rồi. Vậy thì dùng luôn:

Cài đặt tox
# pip install tox
Tự sinh file cấu hình tox.ini
$ tox-quickstart

Sửa file cấu hình tox.ini cho  phù hợp. Ví dụ:
[tox]
envlist = py27, py35

[flake8]
max-line-length = 100

[testenv]
commands =
    flake8 'pho' 'setup.py'
    pylint pho *.py -f parseable -E
    py.test tests/ --junitxml=results.xml

deps =
    -rrequirements.txt
Rồi chạy:
$ tox
...
Để tạo lại virtualenv (khi có thay đổi trong file requirements.txt), gõ
$ tox -r 

Xem thêm các ví dụ trên để tham  khảo.
Tốc tốc tốc hết lên cho tôi :v

Hết.
HVN @ familug.org