LoginSignup
1
0

More than 3 years have passed since last update.

デバッグをしてみた。

Posted at

こんにちは!
今回はデバッグの練習をしていこうかなと思います。
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

参考文献

PythonデバッグTips
最短で試すPythonテストコード

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0