> For the complete documentation index, see [llms.txt](https://andmorefine.gitbook.io/learn-go-with-tests/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://andmorefine.gitbook.io/learn-go-with-tests/go-fundamentals/integers.md).

# 整数

整数

[**この章のすべてのコードはここにあります**](https://github.com/quii/learn-go-with-tests/tree/main/integers)

整数は期待どおりに機能します。試しに `Add` 関数を書いてみましょう。 `adder_test.go` というテストファイルを作成し、このコードを記述します。

**注:** Goソースファイルは、ディレクトリごとに1つの `package` のみを持つことができます。ファイルがそれぞれのパッケージに分けて整理されていることを確認してください。[これについてはこちらの説明がわかりやすいです。](https://dave.cheney.net/2014/12/01/five-suggestions-for-setting-up-a-go-project)

プロジェクトのディレクトリは次のようになっているでしょう。

```
learnGoWithTests
    |
    |-> helloworld
    |    |- hello.go
    |    |- hello_test.go
    |
    |-> integers
    |    |- adder_test.go
    |
    |- go.mod
    |- README.md
```

## 最初にテストを書く

```go
package integers

import "testing"

func TestAdder(t *testing.T) {
	sum := Add(2, 2)
	expected := 4

	if sum != expected {
		t.Errorf("expected '%d' but got '%d'", expected, sum)
	}
}
```

`%q` ではなく、`%d`をフォーマット文字列として使用していることに気付くでしょう。これは、文字列ではなく整数を出力するためです。

また、mainパッケージを使用していないことに注意してください。代わりに、`integers`という名前のパッケージを定義しました。名前が示すとおり、これは`Add`などの整数を操作するための関数をグループ化するものです。

## テストを実行してみます

`go test`を実行します

コンパイルエラーを確認します。

`./adder_test.go:6:9: undefined: Add`

## テストを実行するための最小限のコードを記述し、失敗したテスト出力を確認します

コンパイラを満足させるのに十分なコードを書きます。 *それ以上は書きません* 。テストが正しい理由で失敗することを確認したいのだということを忘れないでください。

```go
package integers

func Add(x, y int) int {
	return 0
}
```

思い出してください。同じ型の引数が複数ある場合(この場合は2つの整数)、 `(x int, y int)` ではなく `(x, y int)`に短縮できます。

ここでテストを実行すると、テストが何が問題なのかを正しく報告していることが確認でき、満足できるはずです。

`adder_test.go:10: expected '4' but got '0'`

[前の](/learn-go-with-tests/go-fundamentals/hello-world.md)節で *名前付き戻り値* について学んだのに、ここでは使っていないことに気づいたかもしれません。名前付き戻り値は一般的に、結果の意味がコンテキストから明確でない場合に使用すべきものです。この場合、`Add`関数がパラメータを足し合わせることはかなり明確です。 詳細については、[こちら](https://go.dev/wiki/CodeReviewComments#named-result-parameters)のwikiを参照してください。

## 成功させるのに十分なコードを書く

TDDの最も厳密な意味では、 *テストをパスするための最小限のコード* を書く必要があります。 杓子定規なプログラマはこうするかもしれません。

```go
func Add(x, y int) int {
	return 4
}
```

ああ！また失敗した！TDDなんてインチキですよね？

別のテストを作成して、いくつかの異なる数字を使用してそのテストを強制的に失敗させることもできますが、 [猫とマウスのゲーム](https://en.m.wikipedia.org/wiki/Cat_and_mouse)のように感じられます。

Goの構文に慣れてきたら、 *「プロパティベーステスト」(Property Based Testing)* と呼ばれる手法を紹介します。 これは、こうした厄介な開発者を食い止め、バグを見つけるのに役立ちます。

とりあえず、きちんと直しましょう。

```go
func Add(x, y int) int {
	return x + y
}
```

テストを再実行すると、合格するはずです。

## リファクタリング♪

ここで *実際の* コードについて改善できることは多くありません。

戻り値に名前を付けると、それがドキュメントだけでなく、ほとんどの開発者のテキストエディタにも表示されることは以前に説明しました。

これは、書いているコードの使いやすさを高めてくれるので素晴らしいことです。型シグネチャとドキュメントを見るだけで、ユーザーがコードの使用法を理解できることが望ましいです。

コメントを使って関数にドキュメントを追加できます。コメントは、標準ライブラリのドキュメントと同じようにGo Docに表示されます。

```go
// Add takes two integers and returns the sum of them.
func Add(x, y int) int {
	return x + y
}
```

### テスト可能な例(Testable Examples)

さらに一歩進みたいなら、[テスト可能な例(Testable Examples)](https://blog.golang.org/examples)を作成できます。標準ライブラリのドキュメントに多くの例があります。

多くの場合、READMEファイルなど、コードベースの外部にあるコード例は、チェックされないため、古くなって実際のコードと食い違ってしまいます。

Example関数はテストが実行されるたびにコンパイルされます。このような例はGoコンパイラによって検証されるため、ドキュメントの例が常に現在のコードの振る舞いを反映していると確信できます。

Example関数は`Example`で始まり(テスト関数が`Test`で始まるのと同様です)、パッケージの `_test.go`ファイルに置かれます。次の`ExampleAdd`関数を`adder_test.go`ファイルに追加します。

```go
func ExampleAdd() {
	sum := Add(1, 5)
	fmt.Println(sum)
	// Output: 6
}
```

(エディターがパッケージを自動的にインポートしない場合、 `adder_test.go`に`import "fmt"`がないため、コンパイルが失敗します。使用しているエディターで、この種のエラーを自動的に修正する方法を調べておくことを強くお勧めします。)

このコードを追加すると、例がドキュメントに表示されるようになり、コードがさらに利用しやすくなります。コードが変更されて例が有効でなくなった場合、ビルドは失敗します。

パッケージのテストスイートを実行すると、Example関数 `ExampleAdd` が、私たちが何も追加の設定をしなくても実行されていることがわかります。

```bash
$ go test -v
=== RUN   TestAdder
--- PASS: TestAdder (0.00s)
=== RUN   ExampleAdd
--- PASS: ExampleAdd (0.00s)
```

コメント `// Output: 6` の特別な形式に注目してください。例は常にコンパイルされますが、このコメントを追加することで、例は実行もされるようになります。試しにコメント `// Output: 6` を一時的に削除してから `go test` を実行してみてください。`ExampleAdd` が実行されなくなることがわかります。

出力コメントのない例は、ネットワークにアクセスするコードなど、ユニットテストとして実行できないコードを示すのに便利です。その場合でも、少なくとも例がコンパイルできることは保証されます。

例のドキュメントを見るために、`pkgsite` を少し見てみましょう。プロジェクトのディレクトリに移動する前に、次のコマンドを実行して `pkgsite` がインストールされていることを確認してください: `go install golang.org/x/pkgsite/cmd/pkgsite@latest` 。次に `pkgsite -open .` を実行すると、`http://localhost:8080` を指すWebブラウザが開くはずです。ここには、Goの標準ライブラリのすべてのパッケージと、インストールしたサードパーティのパッケージの一覧が表示されます。その中に `github.com/quii/learn-go-with-tests` の例のドキュメントがあるはずです。そのリンクをたどり、`Integers`、`func Add` の順に見ていき、`Example` を展開すると、`sum := Add(1, 5)` として追加した例が表示されるはずです。

例を含むコードをパブリックURLに公開する場合は、 [pkg.go.dev](https://pkg.go.dev/)でコードのドキュメントを共有できます。たとえば、[ここ](https://pkg.go.dev/github.com/quii/learn-go-with-tests/integers/v2) は、この章の最終的なAPIです。このWebインターフェースを使用すると、標準ライブラリパッケージおよびサードパーティパッケージのドキュメントを検索できます。

## まとめ

ここで学んだこと

* テスト駆動開発（TDD）ワークフローのさらなる実践
* 整数、加算
* より良いドキュメントを作成して、コードのユーザーがその使用法をすばやく理解できるようにする
* テストの一環としてチェックされるコードの使用例
