Go
GitHub
test
テスト
testing
iRidgeDay 21

準新卒エンジニアがレガシーコード改善のためにテストの書き方を学ぶ方法

今自分に求められている仕事はなんだ?

今私が学ぶべきことはなんだ?

今私が会社に貢献していることはなんだ?

テストだ

注: この記事は、レガシーコードを見ると燃えてくる系若手エンジニア向けの記事です

8月にアイリッジに転職してから日夜テストと格闘している@aimofです。今日はコード資産のない純新卒エンジニアがプライベートにおいてテストを書く練習を始める方法を話します。

「レガシーコード改善ガイド」を読んで

「レガシーコード改善ガイド」を読んで感化されました。テスト書きてー。そう思った時、数千行に渡る汚いコードなんてプライベートではそうそう手元にはありません。今まで作ったものはあってもせいぜい数百行。今更メンテナンスする気も起きない殴り書き……。自分自身の昔のコードがすでにレガシーコードですが、どうせなら、他人の書いた大規模プロジェクトにテストを書きたい!

テストの重要性〜テストのないコードはレガシーコード〜

「レガシーコード改善ガイド」なる本によると「テストのないコードはレガシーコード」です(初出かは知りません)。理由は、テストがなければあらゆるコード改修が綱渡りみたいになるからです。それじゃあ良くない、というわけで、テストを書きます。

プライベートでテストを学ぶにはどうしたら良いか?

現在業務で必要とされているテストは、「自分より実力のある人が書いて」「当初は問題なく動いていて」「改修の必要がある」コードです。コード資産も実力もないエンジニアが用意したコードでは(無駄ではないが)効率が悪いです。

テストがないけど利用されていて自分より実力のある人が書いたコードといえばあれしかない!

お馴染みgithubを漁りましょう。上の条件を満たすコードがゴロゴロ転がっています。

方法!

検索クエリはこんな感じ。

created:>2016-01-01 stars:>200 language:Go license:mit

この結果に対して、Least Recently Updatedでソートをかけます。

検索結果

テストコードなし、メンテなし、スターはある、しかもコード改変可能みたいなプロジェクトが大量に出て来ます。垂涎ものですね。

私のリポジトリ紹介

そんなわけで、クローンさせていただいたのがthymeというリポジトリ(オリジナル)になります。これをクローンして、github.com/aimof/thymeというリポジトリを作成しました。

  • スターが多い
  • Issueが多い
  • テストがない
  • 1年以上ほったらかし
  • 個人的に興味を持てる
  • ライセンス
  • バグだけでなく改修後の要望もたくさん

と今回求めている要件を全部満たした夢のようなリポジトリになります。(ちょっと失礼な言い方ですが)

書いたテストの例

linux.go
// isVisible checks if the window is visible in the current viewport.
// x and y are assumed to be relative to the current viewport (i.e.,
// (0, 0) is the coordinate of the top-left corner of the current
// viewport.
func isVisible(x, y, w, h, viewHeight, viewWidth int) bool {
    return (0 <= x && x < viewWidth && 0 <= y && y < viewHeight) ||
        (0 <= x+w && x+w < viewWidth && 0 <= y && y < viewHeight) ||
        (0 <= x && x < viewWidth && 0 <= y+h && y+h < viewHeight) ||
        (0 <= x+w && x+w < viewWidth && 0 <= y+h && y+h < viewHeight)
}
linux_test.go
func TestIsVisible(t *testing.T) {
    if isVisible(0, 0, 0, 0, 0, 0) {
        t.Error("case0")
    }
    if !isVisible(0, 0, 0, 0, 1, 1) {
        t.Error("case1")
    }
    if !isVisible(1, 1, 1, 1, 2, 2) {
        t.Error("case2")
    }
    if !isVisible(1, 1, -1, -1, 1, 1) {
        t.Error("case3")
    }
}

なんかカバーしきれていない……

この部分、wとhはゼロ以上のはずだたったり、何か書き方が雑だったり色々ツッコミどころが多いのですが、テストの書き方を改めて勉強せねば……。

頑張ろう

まとめ

  • githubを探せばテストの必要なリポジトリはいっぱいあるよ
  • PRもいいけど、まずはクローンして自分なりにやるのも良いかも
  • 勉強しよう
  • github.com/aimof/thymeをよろしく