Pythonで自動テストを行う方法とは?フレームワークの紹介、pytestの活用方法などについて簡単に解説!python 自動テスト

Autify, Inc.

開発の現場は日々進化し、そのスピードは年々加速しています。その中で開発スピードに対応するために、自動テストの普及が進んでいることはご存知でしょうか。自動テストは、開発者が手動で行うテストを自動化することで、開発の効率化と品質保証を実現します。

特に注目すべきは、Pythonを用いた自動テストの構築です。Pythonはその読みやすさと使いやすさから、多くの開発者に支持され、その普及は驚異的なスピードで進んでいます。しかし、Pythonで利用できる自動テストフレームワークの多さから、どれを選べばよいのか迷う方も多いのではないでしょうか。

この記事では、そんなPythonのフレームワークの中から、特に人気のあるpytestを用いた自動テストの進め方について詳しく解説します。Pythonでの自動テスト構築に興味がある方、またはこれから始めようと考えている方にとって、きっと有益な情報となるでしょう。ぜひ、最後までご覧ください。

自動テストとは

自動テストとは、ソフトウェアのテストプロセスを自動化することで、手動での反復的なテスト作業を減らし、効率と精度を向上させる手法です。具体的には、テストケースの実行とその結果の検証を自動的に行います。

自動テストは、開発の早い段階でバグを見つけ出し、修正することが可能です。これにより、ソフトウェアの品質を確保しながら、開発のスピードを向上させることができます。

また、自動テストは新たな機能の追加や既存のコードの修正によって、新たなバグが発生しないかを確認するリグレッションテストにも有効です。

しかし、すべてのテストを自動化することは難しく、また必ずしも効果的ではありません。たとえば、新機能の探索的テストやユーザビリティテストなどは、人間の観察力や直感に頼る部分が大きいため、手動で行うことが適しています。

このように、自動テストは開発プロセスの一部として非常に重要な役割を果たしますが、その導入や運用には適切な理解と計画が必要です。

詳しく「自動テスト」について知りたい方は、当メディアで公開している「テスト自動化とは?8つの種類とテスト自動化のメリットをご紹介!」で、自動テストについて詳細に解説しています。ぜひご覧ください。

自動テストの目的と役割

自動テストの主な目的は、限られた時間と人員で品質を保証するためのコスト削減と効率化です。手動テストでは時間と労力がかかる内容でも、自動テストなら一度テストケースを設定することで、何度でも再実行できるようになり、効率的になります。

また、自動テストは人間のミスを排除し、一貫性と再現性を確保します。これにより、開発者は新しい機能の開発に集中することができ、全体的な開発プロセスがスムーズに進行します。

一方、自動テストの役割は、あくまでデグレード(品質の低下)の確認です。自動テストは、新たに追加または変更された機能が既存の機能に悪影響を及ぼしていないことを確認するために使用されます。

しかし、自動テストが品質を直接向上させるわけではありません。品質向上は、良好な設計、コーディング規約の遵守、適切なコードレビューなど、開発プロセス全体を通じて達成されます。

したがって、自動テストは開発プロセスの一部として重要な役割を果たしますが、それだけで高品質なソフトウェアを保証するものではありません。

出典:

https://products.sint.co.jp/obpm/blog/test_automation

https://autify.com/ja/blog/what-is-automation-testing

自動テストで出来ること・出来ないこと

自動テストはソフトウェア開発プロセスにおいて重要な役割を果たしますが、すべてのテストケースを自動化することはできません。

自動テストで実現できることには、繰り返し実行されるルーチンなテスト、ユーザーの入力を模倣するテスト、および予期しない動作やバグを見つけるためのテストが含まれます。

しかし、ユーザー体験やデザインに関連するテスト、特に視覚的な要素やユーザーの直感的な反応を評価するテストには、人の判断や洞察が必要とされます。

自動テストはプロセスを効率化し、品質を向上させることができますが、人間の洞察と経験に依存するテストも重要です。

Pythonとは?

Pythonは、汎用プログラミング言語のひとつです。シンプルで読みやすい構文を持ち、豊富な標準ライブラリやサードパーティのモジュールを備えています。

1990年代初頭にGuido van Rossumによって設計され、その後、オープンソースコミュニティによって開発が継続されている言語です。

Pythonは多くのプログラミング領域で広く使用されており、ウェブ開発、データ解析、人工知能、機械学習、自然言語処理など、さまざまな用途に適しています。

また、初心者から上級者まで幅広い層に利用されており、学習のしやすさやコミュニティの活発さも特徴です。Pythonの柔軟性とエコシステムの豊富さから、自動テストを含むさまざまな開発タスクにも利用されています。

出典:https://freelance.techcareer.jp/articles/wp/skills/python/detail/550/

Pythonの特徴

Pythonの特徴は多岐にわたりますが、その中でも特に際立つ点は、まず「シンプルさ」と「読みやすさ」が挙げられます。

Pythonの構文は明確で直感的であり、初心者にとっても学習しやすいです。また、コードのブロックをインデントで表現するため、可読性が高く、他のプログラミング言語と比べても簡潔でわかりやすいコードを書くことができます。

さらに、Pythonは「クロスプラットフォーム」であり、「オープンソース」であるという特徴も持っています。

つまり、Windows、macOS、Linuxなどのさまざまなプラットフォームで動作し、誰もが自由に利用できるということです。これにより、Pythonは非常に広範囲なユーザーによって支持され、幅広い用途で活用されています。

出典:

https://docs.python.org/ja/3/library/index.html

https://www.sejuku.net/blog/7720

https://techmania.jp/blog/python0001/

Pythonが選ばれる理由

Pythonは「豊富な標準ライブラリ」と「サードパーティのモジュール」が充実しているため、さまざまな用途に柔軟に対応できます。開発者は効率的にアプリケーションを構築し、複雑なタスクを簡単に実装することが可能です。

これにより、多くの一般的なタスクを簡単に実行できます。たとえば、ウェブ開発にはDjangoやFlask、データ解析にはNumPyやPandas、機械学習にはTensorFlowやPyTorchなど、幅広い分野で利用されるツールが提供されています。

Pythonで自動テストを実行する方法

現在、Pythonで自動テストを実行する際には、フレームワークを使用することが一般的です。これにより、テストの作成、実行、および管理が容易になります。最も広く使用されているフレームワークのひとつに、pytestがあります。

フレームワークを活用することで、以下の利便性が得られます。

一貫性

記述の一貫性を保つには、コーディングルールの設定なども有効ですが、フレームワークの利用もその助けになります。それぞれのフレームワークは ベストプラクティス と呼ばれる、コードの良い書き方についてのガイドラインを持っていることが多く、これらに従うことで、チーム全体で読みやすいコードを書けるようになります。

再利用性とメンテナンス性

フレームワークの多くは、テストコード間で共通したセットアップやクリーンアップなどの手順を定義できるような仕組みを提供しています。これらを上手く使うと、テストコードをシンプルかつ短く収められるため、メンテナンス性が向上します。

拡張性

フレームワークによっては、プラグインのような形で機能を拡張できるようになっているものがあります。これらにより、テストコードのメンテナンスとデバッグを楽にしたり、より見やすいレポートを生成したりなど、幅広いユースケースに対応できるようになります。

チームコラボレーション

統一されたテスト基盤により、チーム全体で一貫したテスト手法を採用でき、コラボレーションが円滑になります。また、新しいメンバーのオンボーディングもスムーズに行えるでしょう。

このように、テストフレームワークを活用することで、テスト作業が効率的かつ効果的に行われ、ソフトウェアの品質向上に大きく貢献します。

Pythonで自動テストを実行する際はpytestなどのフレームワークを使うのが一般的です。

ゼロからコーディングを行う方法もございますが、どちらの方法を選択するかは、プロジェクトのニーズやテストの規模、およびチームのスキルによって異なります。

ゼロからコーディングを行う場合は、柔軟性が高く、細かいカスタマイズが可能ですが、フレームワークを活用する場合は、既存の機能を効率的に利用することができるでしょう。

1.ゼロからコーディングを行う

ゼロからコーディングを行う場合、JavascriptやPythonに深い知識がないとテストコードを効果的に記述することが難しいです。

そのため、優秀なエンジニアが必要であり、また、テストコードを作成するための工数がかかりすぎることがあります。このような状況では、開発速度を上げつつテストを行っていくことが非常に難しく、非効率的であると言えるでしょう。

そのため、プロジェクトの要件やスケジュールを考慮し、フレームワークやツールを活用することで効率的に自動テストを実行する方法を模索することが重要です。

2.フレームワークを活用する

フレームワークは、ソフトウェア開発において特定の目的や機能をサポートするための、基本的な構造や枠組みを提供するツールやプラットフォームのことです。

一方でライブラリは、特定の機能やタスクを実行するための再利用可能なコードの集合体です。つまり、フレームワークはアプリケーションの骨格を提供し、開発者はその骨格の上に具体的な機能を実装しますが、ライブラリは単なる機能の提供に留まり、開発者は自由に使用することができます。

フレームワークを使うことがおすすめですが、その理由として、フレームワークは開発者によって共通の構造やパターンを提供するため、開発の効率化や品質向上を目指せるからです。

また、フレームワークには一般的な問題の解決策やベストプラクティスが組み込まれていることがあります。これにより開発者は再発明することなく、堅牢で安全なアプリケーションを構築することができるでしょう。

次のセクションで、Pythonで利用できるフレームワークをいくつかご紹介します。特徴や機能を理解し、どのフレームワークを自社で利用すべきか、検討するための材料としてぜひご覧ください。

出典:

https://www.school.ctc-g.co.jp/columns/ozawa5/ozawa513.html

https://qiita.com/YoshikiIto/items/2b3ab5ff84610d0f74bd

https://docs.python.org/ja/3/library/index.html

Pythonのテストフレームワーク5選

Pythonのテストフレームワークはさまざまなニーズに対応するため、多くの選択肢があります。その中でも特に人気の高い4つのフレームワークを紹介します。

それぞれのテストフレームワークには特徴があるので、細かく解説していきます。

unittest

unittestは、Pythonの標準ライブラリで提供されるテストフレームワークです。開発者がPythonコードの品質を向上させ、バグを見つけるための効果的な手段を提供します。unittestはPythonの標準ライブラリに含まれています。

unittestの特徴のひとつは、テストケースの作成やテストの実行、結果のレポート作成など、全てを1つのフレームワークで行えることです。また、テストの結果を比較するための豊富なアサーションメソッドも提供しています。

しかし、unittestは柔軟性が高い反面、他のテストフレームワークと比べて主にパラメータ化テストにおいてやや冗長な記述が必要な点が指摘されています。

pytest

pytestは、Pythonのテストフレームワークのひとつであり、unittestよりも柔軟性が高く、シンプルな構文を提供します。これにより、Pythonコードのテストをより効率的に行うことができます。

現在、pytestはPythonコミュニティで広く採用されており、多くのプロジェクトで標準的なテストフレームワークとして使用されています。その人気の理由は、豊富なプラグインや拡張機能のサポート、そして直感的で読みやすいテストコードを書くことができることです。

pytestの特徴として、unittestよりも簡潔なテストコードを書くことができる点が挙げられます。そのため、テストのメンテナンスや可読性が向上し、より開発に集中できるリソースの確保にも繋がるでしょう。さらに、さまざまなアサーションスタイルをサポートしており、テストの記述方法の幅が広がります。

Robot Framework

Robot Frameworkは、Pythonをベースにしたオープンソースのテスト自動化フレームワークです。その独特の記法と豊富なライブラリを活用することで、さまざまなテストスイートを効率的に作成し、実行することができます。

現在、Robot Frameworkは広範囲にわたるテスト自動化タスクに使用されています。ウェブアプリケーション、API、モバイルアプリケーションなど、さまざまな領域で利用されているフレームワークです。

また、そのユーザーフレンドリーな記法と豊富な拡張機能が、多くの開発者やテストエンジニアに支持されています。

Robot Frameworkの特徴のひとつは、人間が読みやすいDSL(Domain Specific Language)によるテストケースの記述です。このDSLは、テストシナリオやアサーションを明確に表現しやすくするため、コードの可読性を高めます。

また、豊富なライブラリやプラグインを利用することで、多様なテストの自動化に柔軟に対応可能です。

自動テストへの向き・不向きとしては、Robot Frameworkは特に統合テストや機能テスト、受け入れテストなど、ビジネスプロセス全体をカバーする大規模なテストスイートに適しています。しかし、初期の学習コストや、カスタムライブラリや拡張機能の開発に時間がかかる場合があるでしょう。

出典:

https://robotframework.org/?ref=upstract.com

https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html

Selenium

Seleniumは、ウェブアプリケーションの自動テストやWebブラウザを操作するためのツールとして広く知られています。主にWebブラウザとの相互作用を模倣し、ユーザーが行う操作(クリック、入力、ナビゲーションなど)を自動化することが可能です。

現在、SeleniumはWebアプリケーション開発の中核的なツールとして使われています。特にCI/CDパイプライン内でのテスト自動化や、ブラウザの互換性テスト、UIの自動テストなど、多くの場面で活用されているツールです。

また、Selenium WebDriverと組み合わせることで、複数のブラウザやプラットフォームでのテストを容易に実行できます。

Seleniumの特徴のひとつは、さまざまなプログラミング言語(Python、Java、JavaScriptなど)との統合が可能であることです。

また、豊富なセレクター機能や操作コマンドを提供しており、高度な自動化テストシナリオを実現できます。さらに、WebDriverを使用することで、リアルなブラウザの振る舞いをシミュレートすることも可能です。

自動テストへの向き・不向きとしては、Seleniumは主にWebアプリケーションのUIテストやブラウザの挙動を確認するためのテストに適しています。

しかし、UIの変更に対するテストのメンテナンスが容易ではない場合や、ロジックやAPIのテストが主体の場合には、他のテストフレームワークやツールの方が適しているかもしれません。

なお、Seleniumは前述の Robot Framework を介して使用することもできます。そうすることで、複雑になりがちなブラウザテストの可読性を高めることができます。

pytestを活用した自動テストの進め方

自動テストはソフトウェア開発において欠かせない要素のひとつです。

その中でもpytestは、Pythonで書かれたテストフレームワークとして広く使われています。pytestを活用することで、効率的にテストを記述し、コードの品質を向上させることが期待できるでしょう。

このセクションでは、pytestを使った自動テストの進め方について解説します。

pytestを使う上での前提知識

pytestを効果的に活用するためには、Pythonの基本的なプログラミング知識が必要です。

具体的には、関数の定義や条件分岐、ループなどの基本的な制御構造の理解が求められます。また、pytestの機能を最大限に活かすためには、Pythonのモジュールやパッケージの扱い方、そして仮想環境の構築方法なども理解しておくとよいでしょう。

さらに、テストの設計やコーディングに関する一般的なエンジニアリングスキルも重要です。これには、テストケースの適切な設計や効果的なテストデータの作成、バグの特定と修正などが含まれます。

pytestを使う上での前提知識を身につけることで、より効率的で信頼性の高いテストスイートを構築することができるでしょう。

1.pytestのインストールと基本設定

まず、Pythonがインストールされていることを確認します。コマンドプロンプトやターミナルで以下のコマンドを実行して、Pythonのバージョンを確認しましょう。

python --version

環境変数にPythonのPathが設定されてない場合は、インストール済みでもバージョン数が表示されません。Windowsの場合はWin+Xを押した後、Fでアプリを開き確認、macOSの場合はファインダーのアプリケーションフォルダから確認してください。

インストールされていれば、以下のように表示されます。

Pythonのダウンロードは公式サイトからできます。

公式サイトからEXEファイルをダウンロードしたらダブルクリックで起動し、以下のイメージの手順で進めます。

※下のチェックボックスはどちらともチェックを入れておきましょう。

以上の画面が表示されたらインストール完了です。

以下のコマンドを実行して、起動の確認をしましょう。

python

上記のように、バージョンと >>> が表示され、文字が入力できるようになれば、pythonの起動に成功しています。

pytestのインストール

pythonの用意ができたら、次はpytestをインストールします。

pip install pytest

コマンドを実行すると以下の表示になり、再度コマンドを入力できる状態になればインストール完了です。

正常にインストールされると、pytestのバージョンを確認できます。

pytest --version

これでpytestの準備まで完了しました。

2.テストケースの仕様を把握する

テストケースの仕様を把握するためには、ソフトウェアのどの仕様や要件に関連するものか明確化しておくことが必要です。また、テストの重要性とpytestの役割を理解することも重要になります。

3.テストコードを記述・実行する

ここまでで、pytestを実行するための準備と、テストに入る前の前提知識をご紹介しました。次は実践として、簡単なテストコードをもとにpytestを動かしてみましょう。

任意の場所に pytest_sample というフォルダを作成し、その中に calculator.py と test_calculator.py と名前を付けたファイルを作成してください。

ファイルの中身は以下の通りです。

calculator.py
def add(a, b):
    return a + b
def subtract(a, b):
    return a - b
def multiply(a, b):
    return a * b
def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero!")
    return a / b
test_calculator.py
import calculator
def test_add():
    assert calculator.add(1, 2) == 3
    assert calculator.add(-1, 1) == 0
    assert calculator.add(-1, -1) == -2
def test_subtract():
    assert calculator.subtract(2, 1) == 1
    assert calculator.subtract(2, 2) == 0
    assert calculator.subtract(2, 3) == -1
def test_multiply():
    assert calculator.multiply(2, 3) == 6
    assert calculator.multiply(-1, 1) == -1
    assert calculator.multiply(-1, -1) == 1
def test_divide():
    assert calculator.divide(6, 3) == 2
    assert calculator.divide(-6, 3) == -2
    assert calculator.divide(6, -3) == -2
    import pytest
    with pytest.raises(ValueError):
        calculator.divide(1, 0)

ファイルの用意ができたら、ファイルを保存しているディレクトリに移動し、以下のコマンドを実行します。

pytest test_calculator.py

実行した結果が以下です。

テストが問題なく実行された例です。では試しに、test_calculator.py の test_add() の3つ目の数値を -2 から -5 に変えて再度実行してみましょう。

テストコードに一致しない部分だけ表示され、エラーを検知することができます。ここまでで基本的な pytest のインストールから、実行までをご紹介しました。

各プロジェクトに合わせてカスタマイズし、効果的な自動テストを導入していきましょう。

まとめ

この記事では、Pythonの特徴から使用されているフレームワーク、特に人気のあるpytestを用いた自動テストの進め方について詳しく解説しました。

Pythonにはさまざまなフレームワークやライブラリが用意されており、どの技術を使用すべきか迷うと思います。

この技術さえ使用していれば問題ないといったものはなく、自社のプロダクトや在籍している技術者に合わせて、適宜最適なツールや技術を選択することが、失敗しないテスト自動化につながるでしょう。