5
3

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 5 years have passed since last update.

golangで開発ことはじめ〜インストール・実行・初歩テスト〜

Last updated at Posted at 2019-05-09

TL;DR

  • goで開発を行うための準備とテストの手順を紹介します
  • 具体的な内容は以下の通りです
    • goのインストール
    • プログラムの実行,バイナリの作成
    • テストの実行,カバレッジレポートの可視化

golangのインストール

  • 以下のような手順です.goのバージョンや,アーキテクチャ(amd64)はgo言語のダウンロードページで確認してください.
    • go言語のダウンロードページから,OSに合わせたファイルをダウンロードします
    • /usr/local/goに展開します(Windowsの場合はC:\goなど,適当な場所でも良いです)
    • 環境変数を設定します
    • Windowsの場合はzipファイルをダウンロードして適当な場所に展開し,環境変数PathGOPATHを設定すれば,コマンドプロンプトから実行できます
# OSXの場合
wget https://dl.google.com/go/go1.12.5.darwin-amd64.tar.gz
sudo tar xzvf go1.12.5.darwin-amd64.tar.gz -C /usr/local
# Linuxの場合
wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
sudo tar xzvf go1.12.5.linux-amd64.tar.gz -C /usr/local

# 両者共通
export GOPATH=~/.go
export PATH=/usr/local/go/bin:${GOPATH}:${PATH}

# goが実行できることを確認
which go
/usr/local/go/bin/go

go version
go version go1.12.5 darwin/amd64 # インストールした環境によって表示が異なる

サンプルプログラムの作成と実行

main.goの作成

  • テスト用のシンプルなプログラムを作って実行してみます
    • 以下のような,main.goを作成します
/*
Sample Program main.go
*/
package main

import(
	"fmt"
)

func HelloWorld() {
	fmt.Println("Hello go World!") // 文字列を出力する
}

func main(){
    HelloWorld() // メソッドHelloWorldをコールする
}

実行

  • go runコマンドで,プログラムを実行できます
go run main.go
Hello go World!

ビルドとバイナリの実行

  • go buildコマンドで,実行バイナリを作ることができます
    • 以下の例では,main_binという名前の実行バイナリを作ります
go build -o main_bin main.go
./test
  • 実行バイナリのファイルサイズが大きくなることが多いので,upxコマンドで実行ファイルを圧縮すると良いです
    • Mac OSXならhomebrewで,Linuxならyum,apt-getなど,パッケージ管理システムでインストールできます
    • 以下のように,実行バイナリmain_binのファイルサイズが半分程度になります.
$ go build -o main_bin main.go
$ ls -l main_bin
2103928  5  9 12:40 main_bin*

$ upx main_bin
...<snip>...
Ultimate Packer for eXecutables
        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   2103928 ->   1073168   51.01%   macho/amd64   test
...<snip>...
$ ls -l main_bin
1073168  5  9 12:40 main_bin*

テストの作成

  • goはプログラムのテストを作成できます
    • テストとは,メソッドをいろいろな条件で実行して,バグを発見したり,コードの修正の影響を確認したりする仕組みのことです
    • main.goのテスト用のプログラムとして,以下のようなmain_test.goを作成します
    • パッケージ名_test.goのように,ファイル名の末尾に_testを付けることで,パッケージのテストも記述できます
/*
Sample Program Unit Test for main.go
*/
package main

import(
	"testing"
)

// TestMain: 各テストを実行する前後に処理をしたい場合は,Runメソッドの前後に記述する
func TestMain(m *testing.M) {
	m.Run()
}

// TestHelloWorld: HelloWorldを実行する関数
func TestHelloWorld(t *testing.T){ // 個別のテスト用メソッド
	HelloWorld()
}

テストの実行

  • go testコマンドで,テストを実行できます
    • -vオプションで詳細なログ出力
    • -coverでコードカバレッジ(テストの実行により通過したコード行の全体に対する割合)を得ることができます
      • このプログラムの場合は,main.goファイル内のHelloWorld関数しか実行していないので,全体の50%しか実行されません
      • HelloWorldメソッドは引数も返り値もないので,メソッドを実行してみる程度しかテストの意味がありませんが,引数を指定して複数回実行したり,返り値の期待値によって処理を変えたりすることができます
# ディレクトリ内のすべてをテスト対象にする場合は, ```go test -v -cover .```でよい
go test main_test.go main.go -v -cover
=== RUN   TestHelloWorld
Hello go World!
--- PASS: TestHelloWorld (0.00s)
PASS
coverage: 50.0% of statements
ok  	command-line-arguments	0.006s	coverage: 50.0% of statements

カバレッジレポートの作成

  • 以下の手順で,コードカバレッジを可視化することができます
    • テスト実行時に,-coverprofileを追加してカバレッジプロファイルを作成しておく
    • go tool coverコマンドで作ったcover.outをhtmlに変換する
# カバレッジプロファイル出力付きでテストを実行する
go test main_test.go main.go -v -cover -coverprofile=./cover.out
go tool cover -html=cover.out -o cover.html
  • 生成されたcover.htmlを見ると,プログラムコードのうち,テストで通過した範囲を確認できます
    ss.jpg

参考

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?