異常系のカバレッジのためにassert()関数を使ってもよいでしょうか


sigaction()のような、コードに誤りがない場合には失敗しない関数の、エラーチェックの実装方法について質問です。

例えば下記のようなコードだと、SIGUSR1のところに変な値を入れない(実装ミスがない)限り、printf("error");は実行されません。そのため、単体テストでprintf("error");を通るテストが書けず、カバレッジが100%にならないのでもやもやしています。

[code]

      ret = sigaction(SIGUSR1, &new_handler, &old_handler);
      if (0 > ret) {
        printf("error");
      }
    
[/code]

そこで、下記のようにassert()関数で返り値をチェックしようと思うのですが、assert()関数の使いかたというか考え方として正しいでしょうか。

[code]

      ret = sigaction(SIGUSR1, &new_handler, &old_handler);
      assert (0 > ret);
    
[/code]




いくつかの問題が絡み合っていそうなので、複数の視点で書きます。

### `assert` で書き換えて良いのか

`assert` で書き換える前と後のコードでは、挙動が異なります。前者は `printf`
するだけですが後者は異常終了します。その変化を受け入れられるのかはチェックしておくべきです。

`assert` でも想定していた挙動を満たすのであれば、単なるコードの書き換えとしては特に問題ないものになります。

### コードカバレッジ 100% を目指すべきなのか

状況にもよるのですが、必ずしもコードカバレッジは 100%
ぴったりを目指さないといけないものではありません。その大変さの割に安全性はそこまで保証されないためです。

もし実際に気にされているコードも `printf`
しているだけの単純なコードであったり、想定していない挙動をしてもさほど影響のないコードであったりするのであれば、わざわざこの条件文の中のカバレッジを気にするのは
やりすぎかもしれません。

参考: [The Case Against 100% Code Coverage](https://about.codecov.io/blog/the-
case-against-100-code-coverage/) \-- Codecov

### モックを利用できないか

ここでいう「テスト」が単体テストであるならば、テストフレームワークによっては関数のモックが利用できるでしょう。「モック」はフレームワークや使われ方によって「スタブ」「ダミー」「ダブル」などとも呼ばれます。

実際に引数を用意して `sigaction`
の返り値が異常になる場合を作るのではなくて、必ず異常になるようなモックを用意して異常系のテストをする方がテストの実装を単純にできます。

