2024年2月28日水曜日

pytest でテストする順番を制御する方法

pytest でテストする順番を制御する方法

概要

pytest-order というライブラリを使って実現します
pytest は基本的には上から実行されます
ファイルが別の場合は名前順に実行されます
またテストに親クラスが設定されている場合は親クラスから順番に実行されます

例えば親クラスにあるテストを後からテストしたい場合には pytest.mark.order というデコレータを使います

環境

  • macOS 11.7.10
  • Python 3.11.6
  • pytest 8.0.2
  • pytest-order 1.2.0

pytest-order なしの場合

  • vim test.py
import pytest


# Testxxx だと2度実行されてしまうので xxxTest という名前にする
class BaseTest:
    def test_two(self):
        print("two")
        assert 2 == 2

    def test_three(self):
        print("three")
        assert 3 == 3


class TestNumer(BaseTest):
    def test_one(self):
        print("one")
        assert 1 == 1
two
three
one

pytest-order ありの場合

import pytest


# Testxxx だと2度実行されてしまうので xxxTest という名前にする
class BaseTest:
    @pytest.mark.order(2)
    def test_two(self):
        print("two")
        assert 2 == 2

    @pytest.mark.order(3)
    def test_three(self):
        print("three")
        assert 3 == 3


class TestNumer(BaseTest):
    @pytest.mark.order(1)
    def test_one(self):
        print("one")
        assert 1 == 1
one
two
three

最後に

順番を制御したい場合には便利です
ただ 1 -> 2 -> 3 という order で 2 と 3 の間に入れたい場合は番号を一つずつインクリメントする必要があるので大変です
そんな場合には整数以外の order も設定できるので 1 -> 2 -> before 3 -> 3 という感じで設定することもできます

import pytest


# Testxxx だと2度実行されてしまうので xxxTest という名前にする
class BaseTest:
    @pytest.mark.order(2)
    def test_two(self):
        print("two")
        assert 2 == 2

    @pytest.mark.order(3)
    def test_three(self):
        print("three")
        assert 3 == 3

    @pytest.mark.order(before="test_three")
    def test_two_point_five(self):
        print("two_point_five")
        assert 2.5 == 2.5


class TestNumer(BaseTest):
    @pytest.mark.order(1)
    def test_one(self):
        print("one")
        assert 1 == 1
one
two
two_point_five
three

もしくは事前に整数を飛ばして間にテストが入っても良いようにしておきましょう

0 件のコメント:

コメントを投稿