0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Go言語(プログラミング)入門メモ㉔

0
Posted at

テストを実行する

作成したコードが正しく動作するか確認するためにテスト用のコードを作成する。テストを作成することでコードに変更があった場合でも、テストが成功すればコードの動作に問題ないことを確認できる。
Goの標準パッケージであるtestingを利用してテストを作成する。

テストコードの作成

入門メモ㉓で作成したmath.goのコードの平均値を算出するAverage関数の動作確認テストを作成する。

package mylib

func Average(s []int) int {
	total := 0
	for _, i := range s {
		total += i
	}
	return int(total / len(s))
}

テストを作る際はテストする対象と同じフォルダに、テスト用のコードを記述するファイルを入れる。testingパッケージはファイル名の末尾が「_test.go」のファイルを読み込んでテストを行うため、ここではファイル名を「math_test.go」とする。
image.png

テストを行う関数は「Test」から始まる関数名で、引数に「*testing.T」受け取る必要がある。そのため、ここではTestAverageという名前で引数に「t *testing.T」を受け取る関数を定義する。
TestAverage関数に、Average関数の動作を確認するコードを書いていく。
Average関数にスライス[]int{1,2,3,4,5}を渡して、結果を変数vに代入する。この時、vには3が入るはずなので、vが3ではなかった場合に「t.Error("Expected 3, got", v)」としてvの値とエラー分を表示させる。
なにもエラーが起こらなければ、このテストは成功したことになる。

package mylib

import "testing"

func TestAverage(t *testing.T) {
	v := Average([]int{1,2,3,4,5})
	if v != 3{
		t.Error("Expected 3, got", v)
	}
}

ターミナルでgo testコマンドを実行してテストを行う。
「go test ./..」とすることで現在のディレクトリとそのしたにあるすべての_test.goがついたファイルを実行できる。
image.png
math_test.goファイルが存在するmylibフォルダでテストが実行され、テストの結果として「ok」が出力されていることが確認できる。

次にテストが失敗するケースとしてスライスに6と7を付け加えて実行する。(スライスの値の平均が4になるので3と異なるようになる)

package mylib

import "testing"

func TestAverage(t *testing.T) {
	v := Average([]int{1, 2, 3, 4, 5, 6, 7})
	if v != 3 {
		t.Error("Expected 3, got", v)
	}
}

再度実行すると設定したエラーメッセージとともにテストの実行結果として「FAIL」が出力されていることを確認できる。
image.png

testingのメソッド

t.Error以外にもテストにしようできるメソッドがある。例えば、t.Fail(テストが失敗し、かつテストの実行を続けたいときに使う)やt.Skip(テストが必要ないときに使う)がある。
t.Skipを使用してみる。Debugという変数の値がtrueであればテストをスキップするようにする。以下のようにmath_test.goを作成する。
t.Skipの引数にはスキップの理由を入れておく。

package mylib

import "testing"

var Debug bool = true

func TestAverage(t *testing.T) {
	if Debug {
		t.Skip("trueだからskipします")
	}

	v := Average([]int{1, 2, 3, 4, 5})
	if v != 3 {
		t.Error("Expected 3, got", v)
	}
}

※補足
変数Debugの条件分岐のところで、「if Debug == true」じゃなくていいの?と思い調べたところ
Go言語では、条件がtrueの場合にifブロック内のコードが実行されるため、if Debugはif Debug == trueと同じ意味を持つ。したがって、if DebugだけでDebugがtrueであるかどうかのチェックが行われます。

if Debug == trueと書くこともできますが、冗長であるため通常は省略されます。if Debugと書くことで、コードが簡潔で読みやすくなる、
ということで問題なしでした。(前に学習したかもしれないが忘れていた。)
※補足終わり
-vオプションを指定して(「go test -v ./...」)テストを実行する。
image.png
想定通り、テストがSkipされてその理由も表示されるようになっている。

学習に使用した教材

・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?