LoginSignup
5
2

More than 3 years have passed since last update.

テストコードを書くことは、ライブラリなどの動作確認にもいいぞ

Last updated at Posted at 2019-11-30

皆が抱くであろう不安

ライブラリのメソッドなどで挙動がわからない、どう動くか不安だ。。。
といったこと、ありませんか?

ドキュメントが公開されていればそれを読むのも大切ですが、多くの人はいきなりプロダクトのコードに組み込まず、挙動を試すと思います。

そういった時にただ手元で試すだけでなく、テストコードとして残るように試すことをおすすめします。

以下、Kotlinで例を見ていきましょう。

String.trim()のテストを書いてみる(例)

kotlin.stdlibには、fun String.trim(): String という、文字列の前後の空白文字を消してくれる便利なメソッドが用意されています。

公式ドキュメント によると、以下のように書かれています。

Returns a string having leading and trailing whitespace removed.

whitespace とありますが、これが「半角スペースのみならず、全角スペースなどは対象になるのかならないのか?」わからなかったりします。
こういう時にテストコードを書いてみます。

TrimTest.kt
@Test
fun trim_FullWidth() {
    val actual = " 全角スペースのテスト ".trim()
    val expected = "全角スペースのテスト"
    assertThat(actual, `is`(expected))
}

このテストは成功します。
つまり、全角スペースを除外対象(whitespace)に含むことがわかります。

他にも、「タブは空白文字として扱われるのか?」や、「複数空白文字がある場合はどうなるか?」なども、同様にテストコードを書けば挙動を確認できます。

TrimOthersTest.kt
@Test
fun trim_Tab() {
    val actual = "\tタブのテスト\t".trim()
    val expected = "タブのテスト"
    assertThat(actual, `is`(expected))
}

@Test
fun trim_SomeWhiteSpaces() {
    val actual = " \t さまざまな空白文字のテスト \t\t   ".trim()
    val expected = "さまざまな空白文字のテスト"
    assertThat(actual, `is`(expected))
}

まとめ

もちろんライブラリのメソッド自体のテスト1(上記の例のテスト)をプロダクトコードで直接書くことは少ないかもしれませんが、trim()を内部で利用するメソッドをプロダクトコードで書いた時には、このテストケースは十分プロダクトのコードに活かせます。

また、手を動かしながら動作確認と学習ができますし、何よりコードとして残すことができ、書いたテストケースに関しては、その挙動は正しいことがわかります。

おまけ

Javaのtrim()は全角スペースが対象外です。以下のテストを書いてみると、テストに失敗し、対象外であることがわかります。

TrimTest.java
@Test
public void trim_FullWidth() {
    String actual = " 全角スペースのテスト ".trim();
    String expected = "全角スペースのテスト";
    assertThat(actual, is(expected));
}

  1. 学習用テストというものがあるようです。また、そもそもライブラリにそのメソッドのテストコードがある場合もあります。直接見に行くこともいいと思いますが、自分で書いて動作を試すという意味では意義があるかと。テストコードがない場合はOSSに貢献するチャンスです!すかさずプルリクを送りましょう! 

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