環境構築から始めるテスト駆動開発 ~Python開発環境を構築する

## はじめに

これは [環境構築から始めるテスト駆動開発 ~ プログラミング環境の共通基盤を構築する ~](https://qiita.com/k2works/items/19d037814875b3a03eb3) の開発言語セットアップ記事です。Windows 10 Home で共通基盤が構築されていることを前提としています。

<!-- more -->

## インストール

スタートメニューから `Windows PowerShell` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/pkg-001.png?raw=true)

Python をインストールします。

```powershell
> scoop install python
```

バージョンを確認しておきます。

```powershell
> python --version
Python 3.9.4
```

## Hello world

### プログラムを作成する

`Projects` フォルダ内に `Python` フォルダを作成してエディタからフォルダを開きます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/001.png?raw=true)

`新しいファイル` 作成アイコンを押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/002.png?raw=true)

ファイル名 `main.py` を作成します。
ファイルを開くと拡張機能インストールの案内が出るので `インストール` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/003.png?raw=true)

拡張機能のインストールが終わるとリンターのインストール案内が出るので `install` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/004.png?raw=true)

`main.py` ファイルに以下のコードを入力します。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何か便利なもの(self):
        self.assertEqual(True, False)


unittest.main(argv=[''], verbosity=2, exit=False)
```

画面左上の三角ボタンを押すとプログラムが実行されます。
最初の実行時にフォーマッタのインストール案内が出るので `Yes` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/005.png?raw=true)

インストールが終わったら再度実行ボタンを押します。
プログラムが実行されて実行結果がターミナルに表示されます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/006.png?raw=true)

テストをパスするようにコードを修正してプログラムを実行します。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何か便利なもの(self):
        self.assertEqual(True, True)


unittest.main(argv=[''], verbosity=2, exit=False)
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/007.png?raw=true)

テスティングフレームワークの動作が確認できたので `hello_world` 関数の作成に入ります。まず以下のコードを追加して テストが失敗することを確認します。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何か便利なもの(self):
        self.assertEqual(True, True)

    def test_簡単な挨拶を返す(self):
        self.assertEqual(hello_world(), 'Hello from Python')


unittest.main(argv=[''], verbosity=2, exit=False)
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/008.png?raw=true)

`helloWorld` 関数を 追加してテストをパスさせます。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何か便利なもの(self):
        self.assertEqual(True, True)

    def test_簡単な挨拶を返す(self):
        self.assertEqual(hello_world(), 'Hello from Python')


def hello_world():
    return 'Hello from Python'


unittest.main(argv=[''], verbosity=2, exit=False)
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/009.png?raw=true)

指定された名前で挨拶を返すようにします。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何か便利なもの(self):
        self.assertEqual(True, True)

    def test_簡単な挨拶を返す(self):
        self.assertEqual(hello_world(), 'Hello from Python')

    def test_指定された名前で挨拶を返す(self):
        self.assertEqual(hello_world('VSCode'), 'Hello from VSCode')


def hello_world():
    return 'Hello from Python'


unittest.main(argv=[''], verbosity=2, exit=False)
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/010.png?raw=true)

関数に引数を追加します。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何か便利なもの(self):
        self.assertEqual(True, True)

    def test_簡単な挨拶を返す(self):
        self.assertEqual(hello_world(), 'Hello from Python')

    def test_指定された名前で挨拶を返す(self):
        self.assertEqual(hello_world('VSCode'), 'Hello from VSCode')


def hello_world(name):
    return f"Hello from {name}"


unittest.main(argv=[''], verbosity=2, exit=False)
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/011.png?raw=true)

`指定された名前で挨拶を返す` テストはパスしましたが今度は `簡単な挨拶を返す` テストが失敗するようになりましたのでデフォルト引数を設定してテストをパスするようにします。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何か便利なもの(self):
        self.assertEqual(True, True)

    def test_簡単な挨拶を返す(self):
        self.assertEqual(hello_world(), 'Hello from Python')

    def test_指定された名前で挨拶を返す(self):
        self.assertEqual(hello_world('VSCode'), 'Hello from VSCode')


def hello_world(name="Python"):
    return f"Hello from {name}"


unittest.main(argv=[''], verbosity=2, exit=False)
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/012.png?raw=true)

仕上げに不要なテストを削除してテストケースの文言をわかりやすくしておきます。

```Python
import unittest


class TestHelloWorld(unittest.TestCase):
    def test_何も指定してない場合は既定の挨拶を返す(self):
        self.assertEqual(hello_world(), 'Hello from Python')

    def test_指定された名前で挨拶を返す(self):
        self.assertEqual(hello_world('VSCode'), 'Hello from VSCode')


def hello_world(name="Python"):
    return f"Hello from {name}"


unittest.main(argv=[''], verbosity=2, exit=False)
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/013.png?raw=true)

### プログラムをデバッグする

まず確認したいプログラムの行を左部分を押してブレークポイント（赤丸）を設定します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/014.png?raw=true)

ブレークポイントを設定したら `実行とデバッグ` を押してプログラムの実行します。そうするとブレークポイント部分でプログラムが停止して変数などの情報が確認できるようになります。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/015.png?raw=true)

`Python File` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/016.png?raw=true)

画面上の実行ボタンを押すと次のブレークポイントに移動します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/017.png?raw=true)

デバッガを終了するには終了ボタンを押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/018.png?raw=true)

ブレークポイントを再度押すことで解除ができます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/019.png?raw=true)

### プログラムをレポジトリに保存する

ソース管理を選択して `リポジトリを初期化する` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/020.png?raw=true)

`全ての変更をステージ` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/021.png?raw=true)

変更内容に `feat: HelloWorld` と入力して `コミット` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/022.png?raw=true)

変更内容は `ソース管理` から確認できます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/023.png?raw=true)

## GitHub に公開する

続いて、GitHub を使ってレポジトリを外部に公開できるようにしてみましょう。

まず、[GitHub](https://github.com/) でレポジトリを作成します。

ログインしたら画面右上の+マークから `New repository` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/024.png?raw=true)

レポジトリ名は `hello-python` として `Public` で公開します。 公開したくない場合は `Private` を選択します。
`Add a README file` にもチェックを入れておきます。
最後に `Create repository` を押して公開レポジトリを作成します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/025.png?raw=true)

公開レポジトリが作成されたら VSCode から読み込めるようにするためリンク先の情報を取得します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/026.png?raw=true)

クリップボードのアイコンをクリックするとレポジトリの URL がコピーできます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/027.png?raw=true)

続いて VSCode に戻り、`表示` メニューから `コマンドパレット` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/028.png?raw=true)

`clone` と入力して `Git クローン` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/029.png?raw=true)

リポジトリの URL へ先ほどコピーした公開レポジトリの URL を貼り付けます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/030.png?raw=true)

公開レポジトリの保存場所を指定する必要があるのでここでは `Projects` フォルダに `GitHub` フォルダを追加してそこに保存することにします。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/031.png?raw=true)

チェックアウトが終わると画面左下に通知が出ますので `開く` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/032.png?raw=true)

準備ができましたので先ほどやった `HelloWorld` プログラムをもう一度作成して先ほどと同様にローカルレポジトリに保存します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/033.png?raw=true)

ローカルレポジトリの内容を GitHub の公開レポジトリに登録します。`表示` メニューから `コマンドパレット` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/034.png?raw=true)

`push` と入力して `Git プッシュ` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/035.png?raw=true)

以下の GitHub 認証画面が表示された場合は `Sign in with your browser` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/038.png?raw=true)

`Authorize GitCrendtialManager` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/ruby-win-github-014.png?raw=true)

GitHub アカウントのパスワードを入力します。

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/ruby-win-github-015.png?raw=true)

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/ruby-win-github-016.png?raw=true)

認証が完了してローカルレポジトリの内容が公開レポジトリに登録されました。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/037.png?raw=true)

内容が反映されているかをブラウザ画面から確認します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617866474/038.png?raw=true)