デバッグをしてみた。

こんにちは！
今回はデバッグの練習をしていこうかなと思います。
[PythonデバッグTips](https://qiita.com/TakesxiSximada/items/45b6d71a44f2706798ed)
[最短で試すPythonテストコード](https://qiita.com/phorizon20/items/acb929772aaae4f52101)
をコピペして試しているだけなので、詳細はこちらをご覧ください！！
##pdbでデバッグ
まずpdbでデバッグします。
以下がデバッグで使用するコードです。

```python

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

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のときのみ処理が止まるようになります。


つぎにテストも同じように実行していきたいと思います。
こちらもコピペになるので詳細を知りたい方は[参照元](https://qiita.com/phorizon20/items/acb929772aaae4f52101)をご覧ください。

```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](https://qiita.com/TakesxiSximada/items/45b6d71a44f2706798ed)
[最短で試すPythonテストコード](https://qiita.com/phorizon20/items/acb929772aaae4f52101)