背景
副業のプロダクト開発で、pytestを使ってユニットテストを書いています。
それまでRubyのRSpecでしか書いたことがなく、他の言語・フレームワークでのテストの書き方について戸惑った箇所があったので、今回は僕と同じようにRSpecを書いていた人がpytestを書くときに役立つような話を書きたいと思います。
知っておいてよかったこと
普段はRSpecでの書き方に慣れているため、pytestでのテストの書き方に最初は戸惑っていましたが、いくつかpytestでもRSpecでよく使う機能と同じことができることがわかりましたので、よくつかうものを紹介します。
pytestでは-k
オプションをつけることで、実行するテストを指定できる
まずはテストの実行時です。
RSpecでは、実行ファイルを指定した後に:
を続けて実行する行数も指定することできます。
$ rspec spec/sample_spec.rb:12
pytestでは-k
オプションをつけることで、実行するテストを指定することができます。
ただし、渡した文字列と完全一致ではなくて部分一致するテストが実行されるので、注意です。
$ pytest -k sample_test
とした場合にはsample_test
を含むsample_test_1
や sample_test_2
という名前のテストが実行されます。
fixtureでテスト前にモックやダミーデータの準備ができる
RSpecではbefore句を使うことでテスト前に実行したい処理を記述できます。
before do
# テスト前に実行したい処理
end
こちらはpytestではfixtureを使ってデータを用意したりします。
下記で使い方を書いたので、もしご興味があればこちらも読んでいただければと思います。
ダミーデータを用意するにはfactory_boyが使える
ダミーデータの用のために、僕はRSpecではfactorybotを用いて実現してきました。
FactoryBot.define do
factory :user do
name { 'name' }
end
end
これと同様のものを、pytestではfactoryboyを使って実現できます。
import factory
from app.models import User
class UserFactory():
class Meta:
model = User
name = 'name'
pdb.set_trace()
でデバッガを呼び出せる
テストの途中でコンソールを使ってデバッグを行いたいときなどにはRailsだとbinding.pry
などを使います。
requre 'pry';binding.pry
pytestではどうするpdb.set_trace()
を使うことができます。
import pdb
pdb.set_trace()
また、実行時に--pdb
オプションをつけてテスト実行すると、テストが失敗した際に自動的にデバッガを起動してくれるので便利です。
$ pytest --pdb sample_test
参考