Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
『テスト駆動Python』入門 ― pytestとテスト駆動開発
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yattom
June 12, 2019
Technology
7.1k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
『テスト駆動Python』入門 ― pytestとテスト駆動開発
書籍『テスト駆動Python』の内容に沿って、Pythonようテスティングフレームワークであるpytestの簡単な使い方などを紹介します。テスト駆動開発についても触れます。
yattom
June 12, 2019
More Decks by yattom
See All by yattom
テストのスライド(内容なし)
yattom
0
130
チームで壁をひとつ越えるためにインテグラル理論を使ってみよう
yattom
1
510
ペアプログラミング復習スライド
yattom
0
700
TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング 復習
yattom
0
530
モブプログラミング 復習スライド
yattom
0
470
アジャイルとスクラムとは ~価値、原則、プラクティス~
yattom
0
16k
テストの自動化とテスト駆動開発
yattom
37
17k
アジャイルの風味をお持ち帰り
yattom
1
380
Happy! Lucky! XP!
yattom
4
1.8k
Other Decks in Technology
See All in Technology
形式手法特論:公平性制約の位相的特徴づけ #kernelvm / Kernel VM Study Kansai 12th
ytaka23
1
750
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
260
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
190
Chart.js が簡単に使えるようになっていたので OGP 画像生成に使った話
kamekyame
0
160
イベントストーミングとKiroの仕様駆動開発で実現する要件の認識合わせプロセス
syobochim
7
1.2k
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
2
250
AIを「創る」と「使う」の循環 — HRテックが実践するリアルなAI組織実装
taketo957
0
1.5k
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.7k
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
0
250
Claude code Orchestra
ozakiomumkj
3
960
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
460
Agentic Web
dynamis
1
130
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
320
A designer walks into a library…
pauljervisheath
211
24k
Prompt Engineering for Job Search
mfonobong
0
330
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
370
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
From π to Pie charts
rasagy
0
200
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
Un-Boring Meetings
codingconduct
0
310
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
190
Building the Perfect Custom Keyboard
takai
2
780
Optimizing for Happiness
mojombo
378
71k
Transcript
『テスト駆動Python』入門 やっとむ こと 安井力 2019.6.12 https://is.gd/Bpl5XQ
安井 力 / やっとむ twitter:@yattom https://www.facebook.com/yattom プログラマー Java Python Ruby
JavaScript テスト駆動開発 アジャイルコーチ ワークショップ 現場導入 技術支援 ゲームを作って一緒に遊ぶ 宝探しアジャイルゲーム、 カンバンゲーム、 心理的安全性ゲーム Python歴 10年以上! (だと思う)
None
None
パンパイプ
pytestとは • Pythonで人気のテスティングフレームワーク • 導入が容易で、テストが書きやすく、学習曲線がなだらか • コミュニティが活発で、機能拡張が豊富 • 日本語の情報も多い (Qiitaで273件)
• わかりやすい日本語の書籍がある
『テスト駆動Python』とは ― 目次 1. はじめてのpytest 2. テスト関数を作成する 3. pytestのフィクスチャ 4.
組み込みフィクスチャ 5. プラグイン 6. 構成 7. pytestと他のツールを併用する
豪華付録も! 付録A. 仮想環境 付録B. pip 付録C. pytestのプラグイン 付録D. Pythonプロジェクトのパッケージ化と配付 付録E.
xUnitフィクスチャ 付録F. クラウドでpytestを使う 付録G. pytestを用いたテスト駆動開発
豪華付録も! 付録A. 仮想環境 付録B. pip 付録C. pytestのプラグイン 付録D. Pythonプロジェクトのパッケージ化と配付 付録E.
xUnitフィクスチャ 付録F. クラウドでpytestを使う 付録G. pytestを用いたテスト駆動開発 pytestに依存しない Pythonの利用方法ガイド 日本語版書き下ろし! 日本語版書き下ろし!
テストの種類について ― まえがきより • ユニットテスト • 統合テスト (インテグレーションテスト、 結合テスト) •
システムテスト • 機能テスト • 皮下テスト 参考: JSTQBの定義(テストレベル) • コンポーネントテスト • 統合テスト • システムテスト • 受け入れテスト JSTQB=日本ソフトウェアテスト資格認定委員会
簡単なテストコード user_test.py: from user import User def test_20歳は成人(): sut =
User(name='yattom', age=20) assert sut.is_adult() def test_10歳は子ども(): sut = User(name='yattomy', age=10) assert sut.is_child()
簡単なテストコード ― クラスにする user_test.py: class TestUser: def test_20歳は成人(self): sut =
User(name='yattom', age=20) assert sut.is_adult() def test_10歳は子ども(self): sut = User(name='yattomy', age=10) assert sut.is_child()
pytestは簡単に使える • テストケースの命名 • ファイル名を test_*.py か *_test.py にする •
関数名の先頭にtestを付ける • クラス名の先頭にTestを付ける • assert • 生のassertで書くだけ • 他ツールではいろいろなassertの書き方を覚えないといけない • 実行結果 • テスト失敗時の表示が懇切丁寧!
実行結果の例
実行結果の例 ― 結果の差異
実行結果の例 ― 文字列の差異
フィクスチャ フィクスチャ = テストで必要となるデータやオブジェクト、前提条件 • 必要なオブジェクトを生成する • データを事前に作っておく • ファイル、ネットワーク接続などのリソースを準備する
@pytest.fixtureで定義し、必要なテスト側でパラメータとして受け取る • それだけ! • 全テストで自動的に利用する、などの設定も可能
フィクスチャの例 @pytest.fixture def clear_db(): pass # データベースを初期化 @pytest.fixture def adult():
return User(name='yattom', age=20) @pytest.fixture def child(): return User(name='yattomy', age=10) def test_20歳は成人(clear_db, adult): assert adult.is_adult() def test_10歳は子ども(clear_db, child): assert child.is_child()
その他のフィクスチャ関連情報
パラメータテストの例 @pytest.mark.parametrize('age, adult, child', [ (20, True, False), (10, False,
True), (19, False, True), ]) def test_成人かどうか(age, adult, child): sut = User(name='yattom', age=age) assert sut.is_adult() == adult assert sut.is_child() == child
モック テストケース内で、テスト対象以外のオブジェクトが必要になるとき、本物のオブジェクト の代わりにモックオブジェクトと呼ばれるテスト用の特別なオブジェクトを用いる。妥当な 結果を返したり、使われ方が合っているか確認したりするのに使う。 • データベースにアクセスしてテストが遅くなるのを防ぐ • 本来なら通信する処理を省略して安定させる • 複雑なオブジェクト構造を構築しないですむ
※テストダブルの一種(ダブル=影武者、代役) 。テストダブルの種類として、モック、スタブ、 スパイ、フェイク、ダミーがある。 http://bliki-ja.github.io/TestDouble/
pytestで使えるモック monkeypatch (組み込みフィクスチャ) • 好きなオブジェクトのアトリビュートやメソッドを自由に置き換える • テストケース内だけで有効、自動で元通りになる • 環境変数も書き換えられる unittest.mock
(標準ライブラリ) • コード内のテスト対象外のオブジェクトや、組み込みオブジェクトを モック化する • モックへの呼び出しを記録し、正しいか確認する • pytest-mockerプラグインと併用すると便利
monkeypatchの例 def read_file(filename): with open(filename, "r") as f: lines =
f.readlines() return lines def test_file_read(monkeypatch): import io dummy_stream = io.StringIO("a¥nb¥nc¥n") monkeypatch.setitem(__builtins__, 'open’, lambda a, b: dummy_stream) lines = read_file('dummyfilename’) assert lines == ['a¥n', 'b¥n', 'c¥n']
mock + pytest-mockerの例 • TBA
テスト実行の制御 テストに@pytest.mark.XXXXを付けて、テスト実行を制御できる XXXXに指定する値 • skip • スキップする(実行しない) まだ開発中でテストできない、など • skipif
• スキップする条件を指定できる • 例: 特定のバージョンの時だけテストする • 自由に指定する • テストに自由にマークを付けて、実行する・しないを指定できる • 例: ローカルの時だけ、CIの時だけ、機能をグループ化する、など
テストの整理分類 • ユニットテスト、コンポーネントテスト • 開発中、手元環境、高速 • 開発者が書く、依存関係や通信などはモックする • 統合テスト •
人が作ったものと組み合わせる、CI環境 • 開発者やテストエンジニアが書く、モック使いすぎると意味なくなるが必要な場合も • E2E(エンドツーエンド)テスト • フロントエンドや外部通信など引っくるめて、テスト環境 • テストエンジニアが手でやるか自動化、pytest-seleniumの出番(かも) • システムテスト • シナリオベース、時間がかかる、データが必要 • テストエンジニアが手でやる、完全な自動化はまれ
テストの整理分類
pytestによる開発者とテストエンジニアの コミュニケーション • pytestは読みやすい、書きやすい • 本体+拡張が非常に強力で機能が豊富、共通ツールになる可能性 • 開発者がテストを書き、テストエンジニアがレビューする • テストエンジニアがテストを書き、開発者が利用・実行する
• 開発者とテストエンジニアがペアプロする • 障害が起きたら、再現テストを書く
“Pytest - why it‘s more popular than unittest?” なんでPytestはunittestより人気なの? http://www.blog.j-labs.pl/2019/02/Pytest-why-its-more-popular-than-unittest
• unittestから簡単に乗り換えられた • 複数CPUに分散実行できる • parametrized モジュールを簡単に利用できる • マーク(mark)を使ってテストスイート(テスト群)を整理できる • flake8と統合できる • テスト結果をHTMLで残せる
付録G pytestを用いたテスト駆動開発 テスト駆動開発とは… • 自動化テストを、開発を進める(駆動する)道具として活用する • テストコードとプロダクトコードを同時に書く※ • 「レッド・グリーン・リファクタリング」のサイクルを 高速にまわす(数分単位)
• 仕様、設計、実装を一連の活動として織り込む ※厳密な「テストファースト」に限らない
「動作するきれいなコード」、ロン・ジェフリーズのこの 簡潔な言葉が、テスト駆動開発(TDD)のゴールだ。 動作するきれいなコードはあらゆる意味で価値がある ─ Kent Beck
きれい 汚い (すぐには)動かない 動作する Green Refactoring TDDと黄金の回転
https://www.flickr.com/photos/emotakespictures/33245514280/ 行き先を示す 道しるべ
足下を照らす 明かり https://www.flickr.com/photos/menschmaschine/19898877294/
自分の 歩幅で
リファクタリング • リファクタリング… きれいなコードを維持するための作業 動作する きれいなコード
きれい 汚い (すぐには)動かない 動作する Green Refactoring TDDと黄金の回転 動作する きれいなコード
きれいを保つ http://www.flickr.com/photos/adwriter/226233780/
リファクタリングの対象 • コードをきれいにする • メソッド名、変数名 • インデント • コメント •
設計も見直す • プロダクトコードもテストコードも見直す • 常にやり続ける • 「動くコード」を保証するテストが前提 大
「きれい」? ◦ きれいな部屋、きれいな机、きれいな作業スペース ×きれいな花、きれいな色、きれいな風景 • 感覚ではなく、論理的なもの • 美醜ではなく、効率や安全に関わるもの 動作するきれいなコード=clean code
that works clean beautiful, aesthetic
なぜ「きれい」? • 読みやすさ • シンプル • 予測 • 安全 •
「動作するもっともシンプルなコード」 • 「もっともシンプル」に到達するには試行錯誤が必要 • きれい、シンプルの基準は、スキルや経験による
TDDは開発手法 あるある: 「あ、きみテスト駆動開発やったことあるの? じゃあテスト書けるね!」 • テスト手法ではない! • プロダクションコードを書くために、テストコードも書く • 他の手法と組み合わせて使える
アジャイルテスト 高品質を追求するアジャイルチームにおけるテストの視点 増田聡 Developer Summit 2010 http://www.slideshare.net/satoshimasuda/ss-3241717
余談: TDDのテストはテストじゃない…? • TDD=開発手法≠テスト手法 • でもテスト書いてるじゃんね • 単純な事実: TDDで書いたテストは 必要なテストすべてを
網羅しない可能性がある (網羅したかったら 網羅するように 書かないといけない) https://www.slideshare.net/goyoki/votddtdd-tdd-on-live
時間があれば… ライブコーディングで テスト駆動開発デモ! 時間なかったら懇親会で!
質問:TDDをやろうと思ったのはなぜですか? 面白そうだったから! ↓ •脳味噌の想像力を超えた設計に到達 •自分の能力を拡大する
質問:TDDを実際の仕事で使いますか?
None
None
None
まとめ • pytestはとっつき易く、修得も早く、痒いところに手が届く • しかも高機能で、さまざまな拡張があり、情報も豊富 • pytestのフィクスチャは最高、知らずに死ぬのはもったいない • プログラマもテストを知るとよいし、 テストエンジニアもpytestを知るとよい
• テスト駆動開発は楽しいし、開発者にとって強力なツール • リファクタリングは技術的負債の返済 = ハードな先行投資 ≠ 感覚やポリシーの話ではない • テスト駆動開発 = 開発手法 ≠ テスト手法
おまけ モブプロについて: アギレルゴ川口さんのHunter社見学記 • http://kawaguti.hateblo.jp/entry/2019/05/04/004855 • http://kawaguti.hateblo.jp/entry/2019/05/07/124007