SlideShare a Scribd company logo
1 of 83
Download to read offline
ソフトウェア工学
nユニットテスト
• V字モデル,assert,ユニットテスト,テスト駆動開発,
xUnitフレームワーク,カバレッジ計測,結合テスト
玉木徹(名工大)
テスト
テストとデバッグ
nデバッグ
• コーディングしても
• コンパイルが通らない
• Syntax error
• 実行できない
• 実行時エラー
• Segmentation fault
• Core dump
• 期待した動きをしない
• コードをデバッグする
• 経験と勘を頼りに
nテスト
• コーディングが終わってコードを
実行する
• 実行結果が仕様と一致しているこ
とを確認する
• 異なる場合にはコードを修正す
る
• すべてのモジュールをテストする
• 網羅的に行う
• 系統立てて行う
• 上位モジュールから下位モ
ジュールまですべて
テストとは
n テスト
• 誤りを発見すること
• 誤りが発見されたらテストの意義があ
る
• テストケースを作成する
• ある入力に対して期待する出力
• モジュールの出力が,期待出力に
一致する=テストは成功(テスト
をパスする)
• 出力が期待するものと違うなら誤
り
• 網羅的,体系的に行う
• 勘やなんとなくではダメ
n テスト専門の資格もあるほど
• JSTQB(Japan Software Testing
Qualifications Board,ソフトウェアテ
スト資格認定委員会)
• 国際ソフトウェアテスト資格
Advanced Level (AL) シラバス, 2012
• ALテストマネージャ,ALテストア
ナリスト,ALテクニカルテストア
ナリスト
• 国際ソフトウェアテスト資格
Foundation Level (FL) シラバス, 2012
• FLテスト技術者
V字モデル
nウォーターフォールモデルの拡張
• 各工程にテストを対応させる
要件定義
外部設計
内部設計
実装
テスト
運用・保守
要件定義
外部設計
内部設計
モジュール
実装
単体
テスト
運用・保守
結合
テスト
システム
テスト
受入
テスト
各テスト工程
n 単体テスト(ユニットテスト)
• 1つのモジュールのテスト
• xUnitなどのテストフレームワークを
用いて自動化する
n 結合テスト
• 複数のモジュールを結合して行うテス
ト
n システムテスト
• システム全体として問題なく動作する
かのテスト
• ベンダ側でダミーデータを用いて行う
• 性能テスト,ストレステストや負荷テ
スト,機能テストなども行う
n 受け入れテスト
• クライアントの要求を満たすかどうか
のテスト
• クライアントへの納品も兼ねる場
合がある
• 実際の現場で実際のデータに対してテ
ストする
• 運用テスト,要件テストなどとも言う
場合がある
ユニットテスト
docker composeを利用する
起動する
$ cd 09_01_add_mult
$ docker compose build
$ docker compose up -d
確認する
$ docker compose ps
停止する
$ docker compose down
ユニットテスト
nユニットテスト(単体テスト)
• ユニット(モジュール)が仕様通りになっているかどうかを確認する
n単純な例
• 2つの引数a, bの和と積を計算する関数(モジュール)をテストする
• 設計
• compute.pyの中にmyadd()とmymult()を作成
nテストコードを書く
• 通常のコードとは別にテスト用にコードを書く
• 仕様に従ってモジュールの入出力をテストする
• 適切な引数と期待する出力のセットを用意する(テストケース)
assert:お手軽なテスト方法
n assert文
• 与えた条件を満たさなければ終了
• エラーメッセージも表示
• assert:「断言する」という意味
• 各種言語に存在
n メリット
• 簡単
• 用途多数
• 関数の引数の確認などにも
n デメリット
• いちいち停止してしまう
• 何度もテストを実行するのには向かない
assert文
満たされるべき
条件式
条件式がfalseの
ときに表示され
るメッセージ
和を計算する
自作myadd
assert 3 == myadd(1, 2), '1+2 is not 3'
コードの準備
コードをチェックアウト
$ git checkout assert
import argparse
from compute import myadd
def main():
parser = argparse.ArgumentParser(description='add or multiply two numbers')
parser.add_argument('arg1', type=int,
help='first argment')
parser.add_argument('arg2', type=int,
help='second argment')
parser.add_argument('arg3', choices=['add', 'mult'],
help='add or mult (default: add)')
args = parser.parse_args()
a = args.arg1
b = args.arg2
c = args.arg3
print(a, b, c)
print(myadd(1, 2))
if __name__ == '__main__':
main()
assertを用いたテストコードの例
通常のmyaddを使うコード
main.py
myadd用のテストコード
assert_add.py
ここで自作関数
myaddを使う
myaddをイン
ポート
今は関係のないコード
myaddのテストケース
2種類
myaddをイン
ポート
まだダミー
自作関数はcompute.py
from compute import myadd
def main():
assert 3 == myadd(1, 2), '1+2 is not 3'
assert -2 == myadd(4, -6), '4+(-6) is not -2'
if __name__ == '__main__':
main()
def myadd(a, b):
return 0
assertを用いたテストコードの例
普通にmainを実行
(1+2の結果は
間違っている)
assertのテストを実行
1+2が3になってない
というエラーで終了
$ docker compose exec mypython python main.py 1 2 add
1 2 add
0
$ docker compose exec mypython python assert_add.py
Traceback (most recent call last):
File "/mnt/assert_add.py", line 10, in <module>
main()
File "/mnt/assert_add.py", line 6, in main
assert 3 == myadd(1, 2), '1+2 is not 3'
^^^^^^^^^^^^^^^^
AssertionError: 1+2 is not 3
$
テストフレームワーク
n専用のライブラリやツール
• xUnit:代表的なフレームワーク
• SmallTalk用のSUnitが起源
(1998)
• 各種言語に存在
• Java:JUnit, …
• C/C++:Cutter, CUnit, …
• Python:PyUnit (unittest),
PyTest, …
• xUnit:これらの総称
• xUnitタイプ以外のものも存在する
nフレームワークの利点
• テストが自動化できる
• 何度も実行できる
• テストを再利用できる
• 手間が最小限
• テストの統計が自動計算される
• カバレッジなども意識できる
n使い方
• モジュールのコードを書く
• テスト用のコードを書く
• テストを実行する
TDD:テスト駆動開発
n通常の開発
• 実際のコードを書く
• それからテストコードを書く
• そしてテストを実行する
nTDD (Test-Driven Development)
• 実際のコードは詳しく書かずに作
成(ダミー)
• テストコードを書く
• テストを実行する
• 最初はダミーなのでテストは失
敗する
• テストを成功させるように実際の
コードを書く
• テストが失敗しないとコードを
書かない
• 成功したらテストコードを更新
する
Lifecycle of the Test-Driven Development methodXarawn - Own work
CC BY-SA 4.0
TDD:テスト駆動開発
n利点
• 満たすべき仕様を先にテストコー
ドとして書ける
• 何度もテストを行える
nBDD
• 振る舞い駆動開発(Behavior
Driven Development)
• TDDの派生
• 上位レベルの振る舞いに特化し
たテスト
• (TDDはユニットテスト)
Lifecycle of the Test-Driven Development methodXarawn - Own work
CC BY-SA 4.0
unittestを用いた
ユニットテスト
Python標準unittestパッケージ
ユニットテストの各種フレームワーク
npytestとunittestが上位2
種類
n補足
• None(テストしない)
が40%弱も!
Jet Brains, Python Developers Survey 2021 Results
https://lp.jetbrains.com/python-developers-survey-2021/
unittest:Python標準のフレームワーク
n パッケージの名称はunittest
• xUnitの1つとして説明されるときには
PyUnitと呼ばれることがある
n 構成要素
• ランナー
• テストの実行を管理
• テストケース
• 入力にして期待する結果
• テストスイート
• テストケースの集合
• フィクスチャ
• テストの実行前の準備
• 例:読み書きするファイルやDBの
セットアップ
https://docs.python.org/ja/3/library/unittest.html
コードの準備
コードをチェックアウト
$ git checkout v0.1
import unittest
from compute import myadd
class TestMyCompute(unittest.TestCase):
def test_myadd1(self):
val = myadd(1, 2)
self.assertEqual(3, val)
def test_myadd2(self):
val = myadd(4, 2)
self.assertEqual(6, val)
if __name__ == "__main__":
unittest.main()
テストコードの作成
n テストコードのファ
イル名はtest_add.py
必ずこのクラスから派生すること
和を計算する
自作myadd
クラス名は
分かりやすく
テストケースはメ
ソッド(名前は分
かりやすく) valが3に等
しいとい
うassert
n自作関数はcompute.py まだ
ダミー
unittestを
実行する
2つ目のテス
トケース
valが6に等
しいとい
うassert
注意:メソッド名は
小文字の「test」で始
まるものだけ!(そ
うでないとテストさ
れない)
def myadd(a, b):
return 0
$ docker compose exec mypython python -m test_add
FF
======================================================================
FAIL: test_myadd1 (__main__.TestMyCompute)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/test_add.py", line 9, in test_myadd1
self.assertEqual(3, val)
AssertionError: 3 != 0
======================================================================
FAIL: test_myadd2 (__main__.TestMyCompute)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/test_add.py", line 13, in test_myadd2
self.assertEqual(6, val)
AssertionError: 6 != 0
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=2)
$
テストの実行1
ダミーコード
なので失敗する
失敗したテストの数
実行したテストの
数と実行時間
実行するテストの
ファイル名から.pyを除いた
もの(-mはモジュールを実
行するという意味)
$ docker compose exec mypython python -m unittest test_add.py
FF
======================================================================
FAIL: test_myadd1 (test_add.TestMyCompute)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/test_add.py", line 9, in test_myadd1
self.assertEqual(3, val)
AssertionError: 3 != 0
======================================================================
FAIL: test_myadd2 (test_add.TestMyCompute)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/test_add.py", line 13, in test_myadd2
self.assertEqual(6, val)
AssertionError: 6 != 0
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=2)
$
テストの実行2
実行するテストの
ファイル名
ダミーコード
なので失敗する
失敗したテストの数
実行したテストの
数と実行時間
TDDを実践
仕様に基づいてテストケースを追加
n以下は架空の内部設計におけるmyadd(a, b)の仕様
• aとbが両方正なら,結果a+bは正
• aとbが両方負なら,結果a+bは負
• aが0なら,結果a+bはb
• bが0なら,結果a+bはa
• aが正,bが負なら
• a > bなら結果a+bは正
• a < bなら結果a+bは負
内部設計の段階で
気がつくべき問題が...
コードの準備
コードをチェックアウト
$ git checkout v0.2
テストコードを作成
n作成するテストコードに対応する仕様
• aとbが両方正なら,結果a+bは正
• aとbが両方負なら,結果a+bは負
条件がTrueである
というassert
条件がTrueである
というassert
class TestMyAdd(unittest.TestCase):
def test_add(self):
val = myadd(1, 2)
self.assertEqual(3, val)
def test_add_pp(self):
val = myadd(2, 6)
self.assertTrue(val > 0)
def test_add_nn(self):
val = myadd(-2, -6)
self.assertTrue(val < 0)
テストを実行:失敗
nコードを書いていない
• 失敗するべき
• 失敗したからコードを書ける
$ docker compose exec mypython python -m unittest test_add.py
FFF
======================================================================
FAIL: test_add (test_add.TestMyAdd)
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
FAILED (failures=3)
$
テストを成功するようにコードを書く
n作成するコードに対応する仕様
• aとbが両方正なら,結果a+bは正
• aとbが両方負なら,結果a+bは負
aとbが正の場合
aとbが負の場合
補足:
ここでは仕様に忠実に実装している
(単なる和の計算だけど)
def myadd(a, b):
if a > 0 and b > 0:
return a + b
if a < 0 and b < 0:
return a + b
return 0
$ docker compose exec mypython python -m unittest test_add.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
$
テストを実行:成功
nコードを書いた
• テストは成功するべき
• 失敗するならデバッグして修正
3つのテストケース
すべて成功
テストコードを追加
n追加するテストコードに対応する仕様
• aが0なら,結果a+bはb
• bが0なら,結果a+bはa
a=0の場合
b=0の場合
def test_add(self):
val = myadd(1, 2)
self.assertEqual(3, val)
def test_add_pp(self):
val = myadd(2, 6)
self.assertTrue(val > 0)
def test_add_nn(self):
val = myadd(-2, -6)
self.assertTrue(val < 0)
def test_add_a0(self):
val = myadd(0, 6)
self.assertEqual(6, val)
def test_add_b0(self):
val = myadd(2, 0)
self.assertTrue(2, val)
$ docker compose exec mypython python -m unittest test_add.py
.F...
======================================================================
FAIL: test_add_a0 (test_add.TestMyAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/test_add.py", line 21, in test_add_a0
self.assertEqual(6, val)
AssertionError: 6 != 0
----------------------------------------------------------------------
Ran 5 tests in 0.001s
FAILED (failures=1)
$
再度テストを実行:失敗
nコードを書いていない
• 失敗するべき
• 失敗したからコードを書ける
テストに失敗
テストを成功するようにコードを追加
n作成するコードに対応する仕様
• aが0なら,結果a+bはb
• bが0なら,結果a+bはa
補足:
ここでは仕様に忠実に実
装している
(単なる和の計算だけ
ど)
a=0の場合
b=0の場合
def myadd(a, b):
if a > 0 and b > 0:
return a + b
if a < 0 and b < 0:
return a + b
if a == 0:
return b
if b == 0:
return a
return 0
再度テストを実行:成功
nコードを書いた
• テストは成功するべき
• 失敗するならデバッグして修正
5つのテストケース
すべて成功
$ docker compose exec mypython python -m unittest test_add.py
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
$
テストコードを追加
n追加するテストコードに対応する仕様
• aが正,bが負なら
• a > bなら結果a+bは正
• a < bなら結果a+bは負
a > bの場合
a < bの場合
def test_add_a0(self):
val = myadd(0, 6)
self.assertEqual(6, val)
def test_add_b0(self):
val = myadd(2, 0)
self.assertTrue(2, val)
def test_add_pn_a_gt_b(self):
val = myadd(4, -1)
self.assertTrue(val > 0)
def test_add_pn_a_lt_b(self):
val = myadd(-1, 4)
self.assertTrue(val < 0)
再度テストを実行:失敗
nコードを書いていない
• 失敗するべき
• 失敗したからコードを書ける
$ docker compose exec mypython python -m unittest test_add.py
....FF.
======================================================================
FAIL: test_add_pn_a_gt_b (test_add.TestMyAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/test_add.py", line 29, in test_add_pn_a_gt_b
self.assertTrue(val > 0)
AssertionError: False is not true
...
----------------------------------------------------------------------
Ran 7 tests in 0.002s
FAILED (failures=2)
$
テストを成功するようにコードを追加
n作成するコードに対応する仕様
• aが正,bが負なら
• a > bなら結果a+bは正
• a < bなら結果a+bは負
補足:
ここでは仕様に忠実に実
装している
(単なる和の計算だけ
ど)
def myadd(a, b):
if a > 0 and b > 0:
return a + b
if a < 0 and b < 0:
return a + b
if a == 0:
return b
if b == 0:
return a
if a > 0 and b < 0:
if a > b:
return a + b
if a < b:
return a + b
return 0
a > bの場合
a < bの場合
$ docker compose exec mypython python -m unittest test_add.py
.....F.
======================================================================
FAIL: test_add_pn_a_lt_b (test_add.TestMyAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/test_add.py", line 33, in test_add_pn_a_lt_b
self.assertTrue(val < 0)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 7 tests in 0.001s
FAILED (failures=1)
$
再度テストを実行:成功...あれ?
nコードを書いた
• テストは成功するべき
• 失敗するならデバッグして修正...?
a < bの場合が
失敗している
内部設計の仕様を再確認
n以下は架空の内部設計におけるmyadd(a, b)の仕様
• aとbが両方正なら,結果a+bは正
• aとbが両方負なら,結果a+bは負
• aが0なら,結果a+bはb
• bが0なら,結果a+bはa
• aが正,bが負なら
• a > bなら結果a+bは正
• a < bなら結果a+bは負
n内部設計のミス.正しくは
• aが正,bが負なら
• |a| > |b|なら結果a+bは正
• |a| < |b|なら結果a+bは負
a > 0, b < 0だから
「a < bの場合」は
ありえない!
テストコードの書き直し
&
コードの書き直し
手戻り
が発生
コードとテストコードの修正
diff --git a/test_add.py b/test_add.py
index ed754ff..a16ec50 100644
--- a/test_add.py
+++ b/test_add.py
@@ -29,7 +29,7 @@ class TestMyAdd(unittest.TestCase):
self.assertTrue(val > 0)
def test_add_pn_a_lt_b(self):
- val = myadd(-1, 4)
+ val = myadd(1, -4)
self.assertTrue(val < 0)
diff --git a/compute.py b/compute.py
index 97424a8..dc5fd2b 100644
--- a/compute.py
+++ b/compute.py
@@ -13,9 +13,9 @@ def myadd(a, b):
return a
if a > 0 and b < 0:
- if a > b:
+ if abs(a) > abs(b):
return a + b
- if a < b:
+ if abs(a) < abs(b):
return a + b
return 0
再度テストを実行:成功
nコードを書いた
• テストは成功するべき
• 失敗するならデバッグして修正(を繰り返す)
$ docker compose exec mypython python -m unittest test_add.py
.......
----------------------------------------------------------------------
Ran 7 tests in 0.000s
OK
$
カバレッジの計算
カバレッジとは
n ホワイトボックステストの指標
• カバレッジ
• 全体に占めるテストした部分の割
合
• 網羅性の指標
• 命令網羅(C0)
• すべての命令を1回以上実行
• 分岐網羅(C1)
• すべての分岐の真と偽をそれ
ぞれ1回以上実行
• 条件網羅(C2)
• すべての分岐の組み合わせ
(経路)を1回以上実行
n コードカバレッジ
• C0網羅率
• 実行した命令数/全命令数
• C0カバレッジ
• C1網羅率
• 実行した分岐数/全分岐数
• C1カバレッジ
• C2網羅率
• 実行した経路数/全経路数
• C2カバレッジ
コードの準備
コードをチェックアウト
$ git checkout main
$ docker compose exec mypython python -m unittest test_add.py
.......
----------------------------------------------------------------------
Ran 7 tests in 0.000s
OK
$ docker compose exec mypython coverage run test_add.py
.......
----------------------------------------------------------------------
Ran 7 tests in 0.000s
OK
$ ls -la .coverage
-rw-r--r-- 1 tamaki staff 53248 6 13 17:24 .coverage
$
coverageコマンドによる計測
カバレッジの実行
テストは成功している
実行するファイル
(テストコードに
限らない)
このファイル内に
計測結果が保存されている
カバレッジ計測結果の表示
カバレッジ計測結果の表示
網羅率
実行され
た行数
実行され
てない行
数
$ docker compose exec mypython coverage report
Name Stmts Miss Cover
---------------------------------
compute.py 29 14 52%
test_add.py 26 0 100%
---------------------------------
TOTAL 55 14 75%
$
カバレッジ計測結果をHTMLで表示
カバレッジ計測結果のHTMLを作成
htlmcov/index.htmlを
ブラウザで見れば良い
$ docker compose exec mypython coverage html
Wrote HTML report to htmlcov/index.html
$ ls htmlcov
compute_py.html favicon_32.png keybd_closed.png status.json test_add_py.html
coverage_html.js index.html keybd_open.png style.css
$
カバレッジ計測結果をHTMLで表示
これがhtlmcov/index.html
compute.pyを
クリックすると
この行が実行されて
いないことが分かる
テストスイート
複数のテストケースを一括で実行
複数のテストケースを作成
nそれぞれのモジュールに
対して作成
• myadd()に対して
test_add.py
• mymult()に対して
test_mult.py
n一括で実行したい
• テストコードが増えると煩
雑
• テストし忘れが発生
nテストスイート
• 複数のテストケースの集合
$ docker compose exec mypython python -m unittest test_add.py
.......
-------------------------------------------------------------------
Ran 7 tests in 0.001s
OK
$ docker compose exec mypython python -m unittest test_mult.py
.......
-------------------------------------------------------------------
Ran 7 tests in 0.001s
OK
$
$ docker compose exec mypython python -m unittest test_compute.py
..............
----------------------------------------------------------------------
Ran 14 tests in 0.002s
OK
$
テストスイートの作成とテストの実行
test_compute.pyを
用意する 各テストコードの
ファイル中のクラス
をインポート
インポートしたテス
トをすべて実行
これをテスト
すると
test_add.pyの7個+
test_mult.pyの7個=合計14
個のテストを実行
import unittest
from test_add import TestMyAdd
from test_mult import TestMyMult
if __name__ == "__main__":
unittest.main()
$ docker compose exec mypython coverage run test_compute.py
..............
----------------------------------------------------------------------
Ran 14 tests in 0.002s
OK
$ docker compose exec mypython coverage report
Name Stmts Miss Cover
-------------------------------------
compute.py 29 2 93%
test_add.py 26 1 96%
test_compute.py 5 0 100%
test_mult.py 26 1 96%
-------------------------------------
TOTAL 86 4 95%
$
テストスイートのカバレッジ
カバレッジも
一度に計算
test_add.pyの7個+
test_mult.pyの7個=合計14
個のテストを実行
VScode連携
Git:テスト毎にコミットすること!
VScodeでのunittest実行
testタブから
このテストファイ
ルを実行
すべてのテスト
ファイルを実行
VScodeでのunittest実行
成功したテスト
成功したテスト
結合テスト
結合テストとは
nおさらい
• 単体テスト(ユニットテスト)
• 1つのモジュールのテスト
• xUnitなどのテストフレームワークを用いて自動化する
• 結合テスト
• 複数のモジュールを結合して行うテスト
n上位モジュールをxUnitフレームワークでテストする
• 上位からテストするので,トップダウンテスト
• そのためにはスタブ(モック)が必要
• unittestフレームワークのMagicMock()を利用する
結合テストの方式
nトップダウンテスト
• 上位モジュールを先に作成・テストする
• 未作成の下位モジュールにはダミー(スタブ)を用いる
nボトムアップテスト
• 下位モジュールを先に作成・テストする
• 未作成の上位モジュールはダミー(ドライバ)を用いる
nサンドイッチテスト
• ボトムアップとトップダウンを並行して行うテスト
モジュール
スタブ スタブ スタブ
ドライバ
モジュール1 モジュール2 モジュール3
上位モジュールの仕様例
n以下は架空の内部設計の仕様
• クラス名:AddOrMult
• コンストラクタに与えるもの
• 和計算関数myadd
• 積計算関数mymult
• メソッド名:do(a, b, c)
• 引数cが文字列’add’ならa+b
を返す
• 引数cが文字列’mult’ならa*b
を返す
n前提
• myaddとmymultはまだ「実装して
いない」
• この段階でAddOrMultをテストす
る
• これは上位モジュールの「ユ
ニットテスト」
• まだ結合テストではない
• myaddとmymultが実装でき
たら結合テストを行う
n用意するもの
• myaddとmymultのスタブ
• モック(mock)とも言う
コードの準備
コードをチェックアウト
$ git checkout main
上位モジュールのコード例
クラス名
コンストラクタ
引数はselfを除いて2つ
与えられた2つの関数を
クラスメンバ(self)と
して記憶しておく
メソッドdoは仕様通り
記憶しておいたself.addと
self.multを使う
integration.py
class AddOrMult():
def __init__(self, add_func, mult_func):
super().__init__()
self.add = add_func
self.mult = mult_func
def do(self, a, b, c):
if c == 'add':
return self.add(a, b)
if c == 'mult':
return self.mult(a, b)
return None
テストコード
実装前なの
で呼び出せ
ない
unittestの
mockを利
用
テストする
上位モ
ジュール
test_integration.py
import unittest
# from compute import myadd, mymult
from unittest.mock import MagicMock
myadd = MagicMock()
mymult = MagicMock()
from integration import AddOrMult
def is_mock(obj):
return obj.__class__.__name__ == 'MagicMock'
class TestAddOrMult(unittest.TestCase):
def test_add(self):
if is_mock(myadd):
myadd.return_value = 8
add_or_mult = AddOrMult(myadd, mymult)
val = add_or_mult.do(2, 6, 'add')
self.assertEqual(8, val)
def test_mult(self):
if is_mock(mymult):
mymult.return_value = 12
add_or_mult = AddOrMult(myadd, mymult)
val = add_or_mult.do(2, 6, 'mult')
self.assertEqual(12, val)
if __name__ == "__main__":
unittest.main()
import unittest
# from compute import myadd, mymult
from unittest.mock import MagicMock
myadd = MagicMock()
mymult = MagicMock()
from integration import AddOrMult
テストコード
準備:
mockかどうか
クラス名で判定する
関数を作っておく
test_integration.py
import unittest
# from compute import myadd, mymult
from unittest.mock import MagicMock
myadd = MagicMock()
mymult = MagicMock()
from integration import AddOrMult
def is_mock(obj):
return obj.__class__.__name__ == 'MagicMock'
class TestAddOrMult(unittest.TestCase):
def test_add(self):
if is_mock(myadd):
myadd.return_value = 8
add_or_mult = AddOrMult(myadd, mymult)
val = add_or_mult.do(2, 6, 'add')
self.assertEqual(8, val)
def test_mult(self):
if is_mock(mymult):
mymult.return_value = 12
add_or_mult = AddOrMult(myadd, mymult)
val = add_or_mult.do(2, 6, 'mult')
self.assertEqual(12, val)
if __name__ == "__main__":
unittest.main()
def is_mock(obj):
return obj.__class__.__name__ == 'MagicMock'
テストコード
mockの返
り値を8に
指定
ここは普通にユニット
テストするだけ
もしmockなら,関数myaddは未実装
なので,テスト用にここで強制的に
myaddの返り値を設定してしまう
test_integration.py
import unittest
# from compute import myadd, mymult
from unittest.mock import MagicMock
myadd = MagicMock()
mymult = MagicMock()
from integration import AddOrMult
def is_mock(obj):
return obj.__class__.__name__ == 'MagicMock'
class TestAddOrMult(unittest.TestCase):
def test_add(self):
if is_mock(myadd):
myadd.return_value = 8
add_or_mult = AddOrMult(myadd, mymult)
val = add_or_mult.do(2, 6, 'add')
self.assertEqual(8, val)
def test_mult(self):
if is_mock(mymult):
mymult.return_value = 12
add_or_mult = AddOrMult(myadd, mymult)
val = add_or_mult.do(2, 6, 'mult')
self.assertEqual(12, val)
if __name__ == "__main__":
unittest.main()
class TestAddOrMult(unittest.TestCase):
def test_add(self):
if is_mock(myadd):
myadd.return_value = 8
add_or_mult = AddOrMult(myadd, mymult)
val = add_or_mult.do(2, 6, 'add')
self.assertEqual(8, val)
$ docker compose exec mypython python -m unittest test_integration.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
$ docker compose exec mypython coverage run test_integration.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
$ docker compose exec mypython coverage report
Name Stmts Miss Cover
-----------------------------------------
integration.py 11 1 91%
test_integration.py 22 0 100%
-----------------------------------------
TOTAL 33 1 97%
$
ユニットテストの実行
テストを実
行
カバレッジ
計測
下位モ
ジュールは
使われてい
ない
結合テスト
n下位モジュールを作成したら結合テスト
モックから 実際の下位モジュールに変更
(後は修正なし)
test_integration.py test_integration.py
import unittest
from compute import myadd, mymult
# from unittest.mock import MagicMock
# myadd = MagicMock()
# mymult = MagicMock()
from integration import AddOrMult
import unittest
# from compute import myadd, mymult
from unittest.mock import MagicMock
myadd = MagicMock()
mymult = MagicMock()
from integration import AddOrMult
結合テストの実行
テストを実
行
カバレッジ
計測
下位モ
ジュールを
使っている
$ docker compose exec mypython python -m unittest test_integration.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
$ docker compose exec mypython coverage run test_integration.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
$ docker compose exec mypython coverage report
Name Stmts Miss Cover
-----------------------------------------
compute.py 29 23 21%
integration.py 11 1 91%
test_integration.py 20 2 90%
-----------------------------------------
TOTAL 60 26 57%
$
pytest:もう一つの方法
unittest以外にもテストフレームワークがあります
pytestは代表的なものの一つです
pytest:Pythonのフレームワーク
nメジャーなテストフレー
ムワーク
• 標準のunittestよりも有名
• unittestよりもシンプル
n簡単な使い方
• pytest スクリプト名.py
• そのテストスクリプトを
pytestで実行
• pytest
• ディレクトリ内にある
「test_***.py」をすべて
実行
https://docs.pytest.org/
コードの準備
コードをチェックアウト
$ git checkout pytest
テストの書き方1
nassertでテスト
• 対象のモジュールが満
たすべき内容をassert
で列挙
• pytestはスクリプト内
の「test_***()」と
いう名前の関数を選択
実行
myadd()が
テスト対象
test_myadd()が
pytestで実行される
import pytest
def myadd(a, b):
if a > 0 and b > 0:
return a + b
if a < 0 and b < 0:
return a + b
if a == 0:
return b
if b == 0:
return a
if a > 0 and b < 0:
if abs(a) > abs(b):
return a + b
if abs(a) < abs(b):
from compute import myadd, mymult
def test_myadd():
assert myadd(1, 2) == 3
assert myadd(2, 6) > 0
assert myadd(-2, -6) < 0
assert myadd(0, 6) == 6
assert myadd(2, 0) == 2
assert myadd(4, -1) > 0
assert myadd(1, -4) < 0
pytestの実行:成功
npytestにスクリプト名
を与える
• オプション「-v」:テス
トを詳しく表示
$ docker compose exec mypython pytest test_compute1.py
===================== test session starts =====================
platform linux -- Python 3.10.4, pytest-7.1.2, pluggy-1.0.0
rootdir: /mnt
collected 2 items
test_compute1.py .. [100%]
====================== 2 passed in 0.01s ======================
$ docker compose exec mypython pytest -v test_compute1.py
===================== test session starts =====================
platform linux -- Python 3.10.4, pytest-7.1.2, pluggy-1.0.0 --
/usr/local/bin/python
cachedir: .pytest_cache
rootdir: /mnt
collected 2 items
test_compute1.py::test_myadd PASSED [ 50%]
test_compute1.py::test_mymult PASSED [100%]
====================== 2 passed in 0.01s ======================
$
$ docker compose exec mypython pytest -v test_compute1.py
===================== test session starts =====================
rootdir: /mnt
collected 2 items
test_compute1.py::test_myadd PASSED [ 50%]
test_compute1.py::test_mymult FAILED [100%]
========================== FAILURES ===========================
_________________________ test_mymult _________________________
def test_mymult():
assert mymult(2, 6) == 12
assert mymult(2, 6) > 0
assert mymult(-2, -6) > 0
assert mymult(2, -6) < 0
assert mymult(-2, 6) < 0
assert mymult(0, 6) == 0
> assert mymult(2, 0) == 1
E assert 0 == 1
E + where 0 = mymult(2, 0)
test_compute1.py:23: AssertionError
=================== short test summary info ===================
FAILED test_compute1.py::test_mymult - assert 0 == 1
================= 1 failed, 1 passed in 0.04s =================
$
pytestの実行:失敗
n失敗すると停止
• assert文が失敗した以降
は,そのスクリプトは実
行されていない
• 他にも失敗するかもしれ
ないが,それは不明
ここでわざと
失敗させてみた
from compute import myadd, mymult
def test_myadd():
assert myadd(1, 2) == 3
assert myadd(2, 6) > 0
assert myadd(-2, -6) < 0
assert myadd(0, 6) == 6
assert myadd(2, 0) == 2
assert myadd(4, -1) > 0
assert myadd(1, -4) < 0
import pytest
from compute import myadd, mymult
@pytest.mark.parametrize(
("a", "b", "c"), [
(1, 2, 3),
(0, 6, 6),
(2, 0, 2),
])
def test_myadd_eq(a, b, c):
assert myadd(a, b) == c
@pytest.mark.parametrize(
("a", "b"), [
(-2, -6),
(1, -4),
])
def test_myadd_lt(a, b):
assert myadd(a, b) < 0
テストの書き方2
nテストケースを別で用
意する
• 「パラメトライズ」と
呼ぶ
• テストケースそれぞれ
でテスト関数を実行
• assertで失敗しても,
次のテストケースへテ
ストを継続する
引数を
別で記述
テスト関数内に
すべて列挙
テスト関数内には
一つのテスト
pytestの実行:成功
n失敗しても継続
• すべての失敗が一度に
検出できる
$ docker compose exec mypython pytest -v test_compute2.py
===================== test session starts =====================
platform linux -- Python 3.10.4, pytest-7.1.2, pluggy-1.0.0 --
/usr/local/bin/python
cachedir: .pytest_cache
rootdir: /mnt
collected 14 items
test_compute2.py::test_myadd_eq[1-2-3] PASSED [ 7%]
test_compute2.py::test_myadd_eq[0-6-6] PASSED [ 14%]
test_compute2.py::test_myadd_eq[2-0-2] PASSED [ 21%]
test_compute2.py::test_myadd_lt[-2--6] PASSED [ 28%]
test_compute2.py::test_myadd_lt[1--4] PASSED [ 35%]
test_compute2.py::test_myadd_gt[2-6] PASSED [ 42%]
test_compute2.py::test_myadd_gt[4--1] PASSED [ 50%]
test_compute2.py::test_mymult_eq[2-6-12] PASSED [ 57%]
test_compute2.py::test_mymult_eq[0-6-0] PASSED [ 64%]
test_compute2.py::test_mymult_eq[2-0-0] PASSED [ 71%]
test_compute2.py::test_mymult_lt[2--6] PASSED [ 78%]
test_compute2.py::test_mymult_lt[-2-6] PASSED [ 85%]
test_compute2.py::test_mymult_gt[2-6] PASSED [ 92%]
test_compute2.py::test_mymult_gt[-2--6] PASSED [100%]
===================== 14 passed in 0.02s ======================
$
$ docker compose exec mypython pytest -v test_compute2.py
===================== test session starts =====================
platform linux -- Python 3.10.4, pytest-7.1.2, pluggy-1.0.0 --
/usr/local/bin/python
cachedir: .pytest_cache
rootdir: /mnt
collected 14 items
test_compute2.py::test_myadd_eq[1-2-3] PASSED [ 7%]
test_compute2.py::test_myadd_eq[0-6-6] PASSED [ 14%]
test_compute2.py::test_myadd_eq[2-0-1] FAILED [ 21%]
test_compute2.py::test_myadd_lt[-2--6] PASSED [ 28%]
test_compute2.py::test_myadd_lt[1--4] PASSED [ 35%]
test_compute2.py::test_myadd_gt[2-6] PASSED [ 42%]
test_compute2.py::test_myadd_gt[4--1] PASSED [ 50%]
test_compute2.py::test_mymult_eq[2-6-12] PASSED [ 57%]
test_compute2.py::test_mymult_eq[0-6-0] PASSED [ 64%]
test_compute2.py::test_mymult_eq[2-0-0] PASSED [ 71%]
test_compute2.py::test_mymult_lt[2--6] PASSED [ 78%]
test_compute2.py::test_mymult_lt[-2-6] PASSED [ 85%]
test_compute2.py::test_mymult_gt[2-6] PASSED [ 92%]
test_compute2.py::test_mymult_gt[-2--6] PASSED [100%]
...
pytestの実行:失敗
n失敗しても継続
• すべての失敗が一度に
検出できる
失敗したテスト
...
========================== FAILURES ===========================
____________________ test_myadd_eq[2-0-1] _____________________
a = 2, b = 0, c = 1
@pytest.mark.parametrize(
("a", "b", "c"), [
(1, 2, 3),
(0, 6, 6),
(2, 0, 1),
])
def test_myadd_eq(a, b, c):
> assert myadd(a, b) == c
E assert 2 == 1
E + where 2 = myadd(2, 0)
test_compute2.py:13: AssertionError
=================== short test summary info ===================
FAILED test_compute2.py::test_myadd_eq[2-0-1] - assert 2 == 1
================ 1 failed, 13 passed in 0.05s =================
$
pytestの実行:失敗
n失敗しても継続
• すべての失敗が一度に
検出できる
ここでわざと
失敗させてみた
VScodeでのpytest実行
testタブから
このテストファイ
ルを実行
すべてのテスト
ファイルを実行
VScodeでのpytest実行
成功したテスト
成功したテスト
課題
nunittestを用いたテストコードを
TDDで作成せよ
• main関数から自作関数を呼び出す
• 関数は複数の引数から何かを計
算し値を返すものとする
• 例:差・商・最大・最小・総
和・冪乗・文字列連結など
• 何か1つの機能なら,ほかの
ものでも良い
• その関数の仕様を5つ程度決める
(内部設計)
• 自作関数は,最初はダミーコードの
みを記述
する
• それぞれの仕様毎に
• テストが失敗することを確認す
る
• 自作関数の,対応する仕様の部
分を記述する
• テストが成功することを確認す
る
• テスト成功毎にgit commitする
nテストコードのカバレッジを計算
せよ
• reportの出力,htmlの出力を確認す
る
想定試験問題
nユニットテストとは何か,その重要性を説明せよ
nassert文とは何か,その使い方を説明せよ
nテストフレームワークとはどのようなものか,その利点も説明せよ
nテストケースとは何かを,具体例で説明せよ
nPythonのxUnitフレームワークunittestの使い方を説明せよ
nTDDとは何か,実践方法と,その利点を説明せよ
nテストスイートとは何かを説明せよ
nカバレッジとは何か,その種類を説明せよ

More Related Content

Similar to ソフトウェア工学2023 11 テスト

TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
Unit testで定時帰宅!
Unit testで定時帰宅!Unit testで定時帰宅!
Unit testで定時帰宅!Funato Takashi
 
Jenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCITakafumi Ikeda
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門Satoshi Watanabe
 
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学Takuma SHIRAISHI
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキングTakayuki Kondou
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術finoue
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidationTakayoshi Tanaka
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージYasutomo Arai
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 

Similar to ソフトウェア工学2023 11 テスト (20)

TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
Spring3.1概要x di
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x di
 
Unit testで定時帰宅!
Unit testで定時帰宅!Unit testで定時帰宅!
Unit testで定時帰宅!
 
Jenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCI
 
Gamedevenvstudy1
Gamedevenvstudy1Gamedevenvstudy1
Gamedevenvstudy1
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門
 
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidation
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 

More from Toru Tamaki

論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...
論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...
論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...Toru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex Scenes
論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex Scenes論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex Scenes
論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex ScenesToru Tamaki
 
論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...
論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...
論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...Toru Tamaki
 
論文紹介:Tracking Anything with Decoupled Video Segmentation
論文紹介:Tracking Anything with Decoupled Video Segmentation論文紹介:Tracking Anything with Decoupled Video Segmentation
論文紹介:Tracking Anything with Decoupled Video SegmentationToru Tamaki
 
論文紹介:Real-Time Evaluation in Online Continual Learning: A New Hope
論文紹介:Real-Time Evaluation in Online Continual Learning: A New Hope論文紹介:Real-Time Evaluation in Online Continual Learning: A New Hope
論文紹介:Real-Time Evaluation in Online Continual Learning: A New HopeToru Tamaki
 
論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...
論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...
論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...Toru Tamaki
 
論文紹介:Multitask Vision-Language Prompt Tuning
論文紹介:Multitask Vision-Language Prompt Tuning論文紹介:Multitask Vision-Language Prompt Tuning
論文紹介:Multitask Vision-Language Prompt TuningToru Tamaki
 
論文紹介:MovieCLIP: Visual Scene Recognition in Movies
論文紹介:MovieCLIP: Visual Scene Recognition in Movies論文紹介:MovieCLIP: Visual Scene Recognition in Movies
論文紹介:MovieCLIP: Visual Scene Recognition in MoviesToru Tamaki
 
論文紹介:Discovering Universal Geometry in Embeddings with ICA
論文紹介:Discovering Universal Geometry in Embeddings with ICA論文紹介:Discovering Universal Geometry in Embeddings with ICA
論文紹介:Discovering Universal Geometry in Embeddings with ICAToru Tamaki
 
論文紹介:Efficient Video Action Detection with Token Dropout and Context Refinement
論文紹介:Efficient Video Action Detection with Token Dropout and Context Refinement論文紹介:Efficient Video Action Detection with Token Dropout and Context Refinement
論文紹介:Efficient Video Action Detection with Token Dropout and Context RefinementToru Tamaki
 
論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...
論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...
論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...Toru Tamaki
 
論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...
論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...
論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...Toru Tamaki
 
論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusion
論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusion論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusion
論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusionToru Tamaki
 
論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous Driving
論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous Driving論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous Driving
論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous DrivingToru Tamaki
 
論文紹介:Spatio-Temporal Action Detection Under Large Motion
論文紹介:Spatio-Temporal Action Detection Under Large Motion論文紹介:Spatio-Temporal Action Detection Under Large Motion
論文紹介:Spatio-Temporal Action Detection Under Large MotionToru Tamaki
 
論文紹介:Vision Transformer Adapter for Dense Predictions
論文紹介:Vision Transformer Adapter for Dense Predictions論文紹介:Vision Transformer Adapter for Dense Predictions
論文紹介:Vision Transformer Adapter for Dense PredictionsToru Tamaki
 
動画像理解のための深層学習アプローチ Deep learning approaches to video understanding
動画像理解のための深層学習アプローチ Deep learning approaches to video understanding動画像理解のための深層学習アプローチ Deep learning approaches to video understanding
動画像理解のための深層学習アプローチ Deep learning approaches to video understandingToru Tamaki
 

More from Toru Tamaki (20)

論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...
論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...
論文紹介:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Gene...
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex Scenes
論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex Scenes論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex Scenes
論文紹介:MOSE: A New Dataset for Video Object Segmentation in Complex Scenes
 
論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...
論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...
論文紹介:MoLo: Motion-Augmented Long-Short Contrastive Learning for Few-Shot Acti...
 
論文紹介:Tracking Anything with Decoupled Video Segmentation
論文紹介:Tracking Anything with Decoupled Video Segmentation論文紹介:Tracking Anything with Decoupled Video Segmentation
論文紹介:Tracking Anything with Decoupled Video Segmentation
 
論文紹介:Real-Time Evaluation in Online Continual Learning: A New Hope
論文紹介:Real-Time Evaluation in Online Continual Learning: A New Hope論文紹介:Real-Time Evaluation in Online Continual Learning: A New Hope
論文紹介:Real-Time Evaluation in Online Continual Learning: A New Hope
 
論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...
論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...
論文紹介:PointNet: Deep Learning on Point Sets for 3D Classification and Segmenta...
 
論文紹介:Multitask Vision-Language Prompt Tuning
論文紹介:Multitask Vision-Language Prompt Tuning論文紹介:Multitask Vision-Language Prompt Tuning
論文紹介:Multitask Vision-Language Prompt Tuning
 
論文紹介:MovieCLIP: Visual Scene Recognition in Movies
論文紹介:MovieCLIP: Visual Scene Recognition in Movies論文紹介:MovieCLIP: Visual Scene Recognition in Movies
論文紹介:MovieCLIP: Visual Scene Recognition in Movies
 
論文紹介:Discovering Universal Geometry in Embeddings with ICA
論文紹介:Discovering Universal Geometry in Embeddings with ICA論文紹介:Discovering Universal Geometry in Embeddings with ICA
論文紹介:Discovering Universal Geometry in Embeddings with ICA
 
論文紹介:Efficient Video Action Detection with Token Dropout and Context Refinement
論文紹介:Efficient Video Action Detection with Token Dropout and Context Refinement論文紹介:Efficient Video Action Detection with Token Dropout and Context Refinement
論文紹介:Efficient Video Action Detection with Token Dropout and Context Refinement
 
論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...
論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...
論文紹介:Learning from Noisy Pseudo Labels for Semi-Supervised Temporal Action Lo...
 
論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...
論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...
論文紹介:MeMViT: Memory-Augmented Multiscale Vision Transformer for Efficient Lon...
 
論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusion
論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusion論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusion
論文紹介:Revealing the unseen: Benchmarking video action recognition under occlusion
 
論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous Driving
論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous Driving論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous Driving
論文紹介:Video Task Decathlon: Unifying Image and Video Tasks in Autonomous Driving
 
論文紹介:Spatio-Temporal Action Detection Under Large Motion
論文紹介:Spatio-Temporal Action Detection Under Large Motion論文紹介:Spatio-Temporal Action Detection Under Large Motion
論文紹介:Spatio-Temporal Action Detection Under Large Motion
 
論文紹介:Vision Transformer Adapter for Dense Predictions
論文紹介:Vision Transformer Adapter for Dense Predictions論文紹介:Vision Transformer Adapter for Dense Predictions
論文紹介:Vision Transformer Adapter for Dense Predictions
 
動画像理解のための深層学習アプローチ Deep learning approaches to video understanding
動画像理解のための深層学習アプローチ Deep learning approaches to video understanding動画像理解のための深層学習アプローチ Deep learning approaches to video understanding
動画像理解のための深層学習アプローチ Deep learning approaches to video understanding
 

Recently uploaded

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Recently uploaded (11)

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

ソフトウェア工学2023 11 テスト