RSpecでのテクニックをpytestで実行するための逆引きメモ

4分で読める テック
最終更新:

背景

副業のプロダクト開発で、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を使ってデータを用意したりします。

下記で使い方を書いたので、もしご興味があればこちらも読んでいただければと思います。

/blog/tech/クリーンアーキテクチャでの依存層を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

参考

質問・リクエストを送る

記事についての質問や、取り上げてほしいテーマがあればお気軽にどうぞ。いただいた質問はブログ記事として回答し、Q&Aページで公開することがあります。