oinume journal

Scratchpad of what I learned

go test in practice

This blog post describes basics and practical examples of go test. Go’s automated test mechanism is well designed and easy to use. I’ll show you some techniques of go test in this article.

What is go test

go test is a command to run automated tests of go packages.

  • Automated test must be defined in _test.go file
  • Automated test function must start with Test prefix

Example: stack

I implement a stack as real world example to explain go test. stack package provides stack.go. If you want to write tests for stack.go, create a file named stack_test.go. The source code is in GitHub repository.

go test [packages]

First of all, let’s test a simple function stack.NewIntStack.

package stack

import "testing"

func TestNewIntStack(t *testing.T) {
    istack := NewIntStack()
    if istack == nil {
        t.Error("NewIntStack() returns nil")
    }
}

The test checks NewIntStack returns non nil. To run the test, type go test ./stack. You’ll get following output. It means the test succeeded.

go test ./stack

ok      github.com/oinume/go-test-in-practice/stack       0.136s

go test -v

-v flag enables verbose mode. You can get a message TestNewIntStack finished by running with -v flag.

func TestNewIntStack(t *testing.T) {
    istack := NewIntStack()
    if istack == nil {
        t.Error("NewIntStack() returns nil")
    }
    t.Log("TestNewIntStack finished") // This message is output only in verbose mode
}
go test -v ./stack

=== RUN   TestNewIntStack
--- PASS: TestNewIntStack (0.00s)
        stack_test.go:10: TestNewIntStack finished
PASS
ok      github.com/oinume/go-test-in-practice/stack       0.132s

all outputs in STDOUT are printed in verbose mode. You can use t.Log or t.Logf if you want to print a message with line number.

If you want to do something only when verbose mode, You can use testing.Verbose() in your test code.

go test -short

You can use -short flag to skip long-running tests. You can refer the flag is on or off by testing.Short() in your test.

Example:

func TestIntStack_PushALot(t *testing.T) {
    if testing.Short() {
        t.Skip("Skip pushing a lot of numbers to a stack")
    }
    istack := NewIntStack()
    for i := 0; i < 10000000; i++ {
        istack.Push(i)
    }
}

go test -run

-run flag is used to specify tests to run. If you have test functions TestNewIntStack and TestIntStack_PushALot, you want to run only TestIntStack_PushALot. You’ll save time with -run flag in order to avoid running whole tests.

Example:

go test -run TestIntStack_PushALot ./stack

=== RUN   TestIntStack_PushALot
--- PASS: TestIntStack_PushALot (1.01s)
PASS
ok      github.com/oinume/go-test-in-practice/stack       1.156s

reflect.DeepEqual

You can use reflect.DeepEqual to compare two values of structs. Following example ensures istack1 and istack2 are the same.

func TestIntStack_Compare(t *testing.T) {
    istack1 := NewIntStack()
    istack2 := NewIntStack()
    for i := range []int{1, 2, 3} {
        istack1.Push(i)
        istack2.Push(i)
    }
    if !reflect.DeepEqual(istack1, istack2) {
        t.Errorf("Stacks must be the same: istack1.Size=%d, istack2.Size=%d", istack1.Size(), istack2.Size())
    }
}

TestMain

TestMain is a main function in automated tests. Sometimes it is necessary for a test program to do extra setup or teardown before or after testing. If func TestMain(m *testing.M) function exists in your package, the generated test will call TestMain(m) instead of running the tests directly. This is an example to set up and tear down with TestMain.

func TestMain(m *testing.M) {
    // Set up something for tests
    status := m.Run()
    // Tear down something for tests
    os.Exit(status)
}

And more

go test has much more features like benchmark, example test, etc. You’ll find them out in document of testing package. There are also good slides of testing like Advanced Testing with Go // Speaker Deck.

読書感想「ルポ MOOCS革命」

ルポ MOOC革命――無料オンライン授業の衝撃

ルポ MOOC革命――無料オンライン授業の衝撃

を読んだので、メモと感想。

感想

まず「MOOCSってなに?」という状態からスタートした自分。MOOCSとはMassive Open Online Coursesのことで、有名なところだと coursera とか udacity がある。大学の講義などをオンラインの動画で見ることができて、どこにいても講義を受けられることがメリット。

この本の最初の方は、いかにMOOCSが素晴らしいか、MOOCSを使っていい教育を受けた人がいるかを述べていて、若干退屈だったけど、中盤から後半はMOOCSの仕組みとかビジネスモデルについて詳しく書かれていて良かった。あと、作者本人が取材しているので実際の生徒の生の声が書いてあるのが良かった。

2013年に出版された本なので若干情報が古いけど、作者自身シリコンバレーに行ってcouseraやudacityにヒアリングしているなど、かなり骨太なルポですごいなと思った(小並感

最初の方

  • 学び続ける母親の姿は家族にも良い影響を与える。子供も勉強するようになる。
  • コンピュータを使ったデータ解析がいいらしい。
  • 一度は教科書で学んだ内容でも、大学教授の解説を聞くと不思議なほど理解が深まった。スタンフォード大学の講座を受けた人の話。

p.40

求職中の受講生の学習履歴を見ることができる。この講義で成績トップ10の情報を知りたい、との企業からの依頼にもコーセラは応じる。

p.47 ユダシティのビジネスモデル

企業が講座の制作費をサポートし、講師が学生に教える。受講生はきちんとスキルを証明することで就職できる。企業は能力と努力を確かめて新しい人材を探せる。 プラットフォームとしてのユダシティにも運営資金が入る

p68

ムークで好成績を収める人は大学入学にも道が拓ける

p75 オープン教材について

高校の数学の授業ではなぜその公式が機能するのかを説明しないが、MITの教材では動画でそれを説明していた。

p135 サルマン・カーン

わかりやすい説明で有名になった。足し算から高度な数学や経済学、生物学、物理学、宇宙論など一人で講義動画を撮影している。日本語字幕もある 講義の中では、微分積分のコースで、マイナスとマイナスをかければプラスになる、というような細かいことも声に出す。これをありがたいと思う子供がたくさんいるらしい。カーンアカデミーの運営費は700万ドル。VCの資本は入れず、ゲイツ財団や個人の寄付から成り立っている。

p146

現在の学校教育では、教える時間が固定されていて、生徒の理解度は変数になっている。これは逆で生徒の理解度を固定するべき。特に数学は一度理解が追いつかなくなると、次の授業も理解できなくなってしまう。

p158 反転授業

講義のビデオを自宅で見て、授業では宿題や課題をやること。生徒は実践的な学習や友人との共同作業、友人の成果を評価することに取り組む。先生たちは子供たちに一対一で教えたり、助言したり、鼓舞したりできるようになる。これは先生が中心の教室から、生徒が中心の学習環境へのシフトである。

p202 日本でのオープンエデュケーション

manavee。大学受験応援サイト。 予備校に通えるのはお金がある家庭だけ。マナビーは全て無料。 動画を見ていた受験生が大学生になりボランティアで講義で教えるという好循環。

学校では教えてくれない教科でもマナビーでは講義がある。 テクノロジーで教室を再現することはできないか?hangoutとかで。

お金を節約するワザ

個人的にやっているお金の節約方法をまとめてみる。

Amazonで商品をなるべく安く買う方法

Amazonギフトカードを安く買う

まずはAmazonでの買い物を2〜8%安くする方法。世の中にはAmazonギフトカードを安く手に入れることができるサイトがいくつかあって、だいたい2〜8%OFFぐらいで買うことができる。代表的なサイトとしては下記がある。

「アマゾンギフト券 安く」でググると色々とこの手のサイトが出てくるので調べてみるといいと思う。

Amazonのマーケットプレイスを活用する

新品にこだわらなければAmazonのマーケットプレイスはかなり安く商品を買うことができる。自分は本に関しては新品かどうかは気にしていない。新作の本でなければ、Amazonのマーケットプレイスは送料込みでだいたい半額ぐらいで買うことができる。そして読み終わった本はメルカリなどで売ってしまえば「一粒で2度おいしい」感じになる。

Amazonプライムすごい

  • 送料が無料になる
  • 映画が見放題
  • 音楽も聴き放題
  • Kindle本が毎月1冊無料
  • 写真を無制限にクラウドストレージに保存可能

という特典がついて年間3900円(税込)なんだからすごい(月で換算したら325円!)。自分はNetFlixやHuluは解約してAmazonプライムだけにしてしまった。

ネット通販ならヨドバシもいいぞ

自分の中ではAmazonと並ぶぐらい利用しているのはヨドバシ。ヨドバシがなぜいいかはおいぬま日報: ヨドバシドットコムが始まり過ぎてる件にまとめてあるが、

  • どんな商品でも送料が無料
    • AmazonはAmazonプライムに入らないと送料無料にならない場合があるが、ヨドバシではそんなことはない。
  • 13時までに注文すれば当日配送
  • 日用品も含めて商品が充実している
  • 10%のポイントが付く。このポイントを考慮するとAmazonより安い場合がある

などが良い点。ヨドバシの余ったポイントはWebMoneyかiTunes Cardを買ってしまうとさらにお得だ。

格安SIMを使う

oinume.hatenablog.com

以前上の記事を書いたんだけど、3大キャリアから乗り換えるだけで月数千円は節約できる。自分は月6000円かかっていた携帯代がIIJ mioにすることで月3000円未満になった。SIMフリーのiPhone7はかなり高いけど、iPhone SEは税込みで約5万4000円で買えるので、2年使えば本体を買い替えてもお釣りがくる。

格安SIMは今だと

  • Facebook/Twitter/Instgram/LINE の通信料がチャージされないLINEモバイル
  • 速度が安定しているらしいmineo
  • なんだかんだでユーザー数が多いIIJ mio

あたりが良さそう。

iTunes Storeで安く買う方法

年に何回かコンビニなどでiTunes Storeのギフトカードがおまけ付きで買える(実質10%OFFになる)キャンペーンがやっているので、iTunes Card割引速報をチェックすればいつキャンペーンがやっているかがわかる。音楽を買ったり映画をレンタルする人にはオススメ。

住宅ローンの借り換え

これはすごい対象者を限定する内容だけど、チャットで質問に答えることで今より安い住宅ローンの借り換えプランを提案してくれるアプリがあるので、金利が高めで借りた人は借り換えを検討してみることをオススメする。

mogecheck.jp

2017年の抱負

明けましておめでとうございます。いまだに年賀状に手をつけられていない怠惰な人間ですが、新年の抱負を書きます。

機械学習を学ぶ

今まで機械学習を勉強しても実践する場がなかなか見つけづらかったけど、自分で作ったサービスもあるので学んだ成果を投入できればいいなと思っている。CouseraのMLコースを受講していたけどつまらなくて2週間で挫折してしまった。ただ、以下の記事を見るとあれに挫折するのは自分だけではないということがわかったので、この記事を参考にして勉強するとっかかりをなんとか掴みたい。

postd.cc

アルゴリズム勉強する

去年から引き続き。

健康

  • 最近体力が落ちてきているので、スクワットもしくはランニング等何かしらの運動をするようにしたい。といいつつこの三が日まだ何もできてないんだけど。とにかく適度な運動と睡眠が健康のためには不可欠ということを学んだので...
  • 睡眠時間は1日6時間以上を心がけたい

英語

目安でいうとTOEIC800点ぐらいあれば英語でなんとかコミュニケーション取れるぐらいかなぁと思っているので頑張る。

VPSをやめる

  • 昔のブログのリダイレクト専用サーバー
  • Vagrant Imageの置き場所

のためにVPSを運用しているのだけど、前者はAWS lambda + API Gatewayでいいし、後者はAWS S3+Cloud Flareでいける気がするので移行する。

去年より本を読む

2016年に読んだ本 - oinume journal

技術書以外だと去年はあまり本を読めなかったけど、今年はネットを見る時間を減らして1冊でもいいから去年よりも本を多く読みたい。

Twitterの時間を制限する

最近気がつくとTwitterを見てしまっているんだけど、自分はSocial Mediaで人生が変わるような体験をしているわけではなく、時間がもったいないので1日30分に制限したい。FacebookとInstagramはフォローしている人を減らしてアプリを削除したら時間が激減したのでTwitterにもこれを適用していく所存。

2016年の振り返り

まずは今年の1月に書いた新年の抱負を振り返ってみる。

英語を頑張る

技術的なやり取りは苦がなくできるぐらいになっていたいなぁと。会話も文章も両方で。あとブログの英語比率を50%に持って行きたい。あと何か1冊英語の本を最後まで読む。

ブログの英語比率は 6 / 18 で33%だった。12月ぐらいから面倒になってほぼすべて日本語で書いてしまっていたのが敗因。ただ、会社でTOEICを10年振りに受けて、745点だったのでそこそこDMM英会話の成果は出ている気がする。リーディングよりリスニングの方が点がよかったのが嬉しい。

アルゴリズム勉強する

6月までにB+Treeをソラで実装できるようにしたい

未達。algoというリポジトリでアルゴリズムやり直してるけど、ハッシュをソラで実装するのがギリギリできるかぐらいだった。

機械学習を勉強する

ライブラリやフレームワークを使ってちょいちょいできるぐらいになってたい。

これも未達。CourseraのMachineLearningのコース受けたけど挫折…

何かサービスを一つ作る

これはlekcijeというサービス作ったので達成。マイナーなニーズにもかかわらず、リリースしてから1ヶ月で40人の人に使ってもらえてるのが嬉しい!ただ、サービスを作っていると無限にやりたいことが出てきて、本来やりたかった勉強の時間をついつい開発の時間にあててしまうのが悩みどころ...

今年こそDocker

仕事とプライベートでは軽く使っているので達成かな。基本的なところをもっと理解しないと。

抱負以外でやったこと

Web+DB Pressの特集書いた

Web+DB Press Vol.93に前職の同僚とSQLの高速化について記事を書いた。ものを書くのは人生で2回めだったのである程度はわかっているつもりだったけど、想像を絶する大変さで5月の休日をほぼ全部これに費やしてしまった。でもSQLのチューニングについて自分の理解が甘いところも理解を深めることができたのでありがたい機会だった。あと、最近の執筆活動はGitHubで原稿の管理ができるので進捗管理や共同作業は楽だなぁと思った!

Advent Calendar

Advent Calendarを3本書いた。Herokuのヤツはまだ欠けているところがあるので、これからでもネタ考えて埋めたい。

OSS活動

tomahawkを少しメンテナンスしたのと、他の人のライブラリに軽くプルリクしたぐらい。来年はもっとちゃんとした機能追加や改善のプルリクを送りたいなぁ。

プログラミング言語

プログラミング言語についてはずっとGoをやっていて、もうかれこれ2.5年ぐらいGoを書いてる。Pythonをプライベートでもほぼ書かなくなってしまったのでこっちもリハビリしないと。

まとめ

今年は歳のせいか地味に体を壊すことが多くて、体調回りで苦労することが多かった。運動してないせいで体力が落ちているのが一番問題だと思っているので、来年はランニングまたは筋トレを本腰入れてやるつもり。一方で、家族は大きな病気をすることもなく元気に過ごせていたのが一番ありがたかった。2017年は健康を第一に、体力をつけて仕事も私生活もハードワークできるようにしたい。