Django 目前的測試整理


  1. 使用django 內建的測試指令,django內建會去memory建立一個DB做測試用。
    • # python manage.py test     去執行所有test開的頭的測試檔。並在需要建立DB的時候建立一個名為test_django的DB做測試
    • # python manage.py test  web.tests.test_signin      -> 指定測試 web/tests/test_signin.py這個檔案
    • # python manage.py test --setting=portal.settings.ci   -> 指定測試設定檔例如我們原本都用mysql在開發,但是測試的時候為了加速測試時間,所以可以在portal/settings/ci.py這個設定檔內改用sqlite做測試用的db。所以測試時加上這個參數就可以讓django測試時建立的DB改用ci.py內寫的sqlite。
  2. 使用py.test 這邊我有多裝pytest-django 但是無法直接使用pytest-django,因為不知道為什麼會報錯。所以是用pytest-django的優點然後跑py.test。
    • 這邊依舊也是要寫個pytest.ini作為py.test起始的設定檔。
      [pytest]
      norecursedir =.git
      DJANGO_SETTINGS_MODULE = portal.settings.ci

      主要是告知py.test不要去掃.git資料夾裡面有沒有測試檔。至於第三行的環境設定檔後來發現如果你的virtualenv環境沒有export Django的環境設定,他才會執行這行否則會以virtualenv的環境設定為主並且在需要DB的時候建立DB,測試完之後就會刪除。
    • 要注意環境設定檔 (export DJANGO_SETTINGS_MODULE=xxxxxx) 如果像我是有分local開發跟production不同的settings module在run py.test會依env為主,如果env找不到DJANGO_SETTINGS_MODULE的設定,才會依pytest.ini裡面的設定為主。
    • # py.test  就會跑所有的test開頭測試檔。
    • # py.test web/tests/test_signin.py    -> 只執行 web/tests/test_signin.py 這個測試檔。
    • # py.test web/tests/test_signin.py -s  --> 可以秀出在測試檔裡面的print 內容。
  3. Django coverage:
    在做測試的時候會做覆蓋率的報告。在django的官網是建議我們安裝coverage這套軟體,但是如果要配合py.test的話,就不能用官網介紹的方式下指令。 ex:
    coverage run --source='.' manage.py test myapp
    coverage report
    必須加入 -m 這個 加入module的方式來跟py.test做整合。 EX:
    coverage  run  --source='.'  -m  py.test
    coverage  report

    這樣就能把coverage 與 pytest 做整合。

留言