こんにちは!
今回はデバッグの練習をしていこうかなと思います。
PythonデバッグTips
最短で試すPythonテストコード
をコピペして試しているだけなので、詳細はこちらをご覧ください!!
pdbでデバッグ
まずpdbでデバッグします。
以下がデバッグで使用するコードです。
import pdb;
for ii in range(1, 21):
if ii % 15 == 0:
print('Takeuchi Tsuyoshi')
elif ii % 3 == 0:
print('Takeuchi')
elif ii % 5 == 0:
print('Tsuyoshi')
else:
print(ii)
まず起動させます。
python -m pdb ファイル名
コマンド「n」を打つと一行ずつ実行されます。
(Pdb) n
> /home/takeuchi/test.py(4)<module>()
-> for ii in range(1, 21):
(Pdb) n
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) n
> /home/takeuchi/test.py(7)<module>()
-
> elif ii % 3 == 0:
(Pdb)
そしてコマンド「c」を打つと一行ずつではなく一気に処理を進めます。
> /home/takeuchi/test.py(4)<module>()
-> for ii in range(1, 21):
(Pdb) c
Takeuchi
4
Tsuyoshi
Takeuchi
7
8
Takeuchi
Tsuyoshi
11
Takeuchi
13
14
Takeuchi Tsuyoshi
16
17
Takeuchi
19
Tsuyoshi
The program finished and will be restarted
> /home/takeuchi/test.py(1)<module>()
-> import pdb;
(Pdb)
bでブレークポイントを指定し、そこまでの処理を確認することができます。
ためしに、if文の最初の分岐までの処理を実行してみましょう。
ちゃんと出力されました。
(Pdb) b 5
Breakpoint 1 at /home/takeuchi/test.py:5
(Pdb) c
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
1
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
2
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
Takeuchi
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
4
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
Tsuyoshi
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb)
Takeuchi
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
c(Pdb) c
7
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
8
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
Takeuchi
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
Tsuyoshi
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
11
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
Takeuchi
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
13
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
14
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb) c
Takeuchi Tsuyoshi
> /home/takeuchi/test.py(5)<module>()
-> if ii % 15 == 0:
(Pdb)
(Pdb) b 5, ii == 15
とすることでiiが15のときのみ処理が止まるようになります。
つぎにテストも同じように実行していきたいと思います。
こちらもコピペになるので詳細を知りたい方は参照元をご覧ください。
test2.py
import unittest
import test as tt
class FizzBuzzTest(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_normal(self):
self.assertEqual(1, tt.fizzbuzz(1))
def test_fizz(self):
self.assertEqual("Tsuyoshi", tt.fizzbuzz(3))
def test_buzz(self):
self.assertEqual("Takeuchi", tt.fizzbuzz(5))
def test_fizzbuzz(self):
self.assertEqual("Takeuchi Tsuyoshi", tt.fizzbuzz(15))
if __name__ == "__main__":
unittest.main()
def setUp(self)
とdef tearDown(self)
は初期化・終了のタイミングで走る関数らしいです。
assertEqual()
は第一引数と第二引数が同じ値かどうかを調べてくれています。
そして以下がimportしているtest.pyになります。
test.py
def fizzbuzz(number):
if number % 15 == 0:
return "Takeuchi Tsuyoshi"
if number % 5 == 0:
return "Takeuchi"
if number % 3 == 0:
return "Tsuyoshi"
return number
if __name__ == "__main__":
for i in range(1, 101):
print(fizzbuzz(i))
実行結果は以下の通りです!!
❯ python test2.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK