2016-06-19 14 views
1

PHPUnitテストでPHPのバックグラウンドからテストに行くのはかなり新しいです。Goユニットテスト - 致命的テストとテストmain()

PHPでは、あなたが100%のカバレッジが必要であることをかなり心から説教しています。 私がテストについて読んだほとんどのものは、エラーを引き起こすようなものがなくても最小限に見えます。例えば

私の小さなプログラム:今

func main() { 
    config = readConfig("config.json") 
} 

func readConfig(path string) Config { 
    var cfg Config 
    file, err := ioutil.ReadFile(path) 
    if err != nil { 
     log.Fatal(err) 
    } 
    err = json.Unmarshal(file, &cfg) 
    if err != nil { 
     log.Fatal(err) 
    } 
    return cfg 
} 

func TestCanReadConfig(t *testing.T) { 
    cfg := readConfig("test_data/config.json") 
    if cfg.Broker_pass != "test" || cfg.Broker_port != "3333" { 
     t.Error("invalid config") 
    } 
} 

()メインは、すべてのユニットテストでで覆われていないので、私はカバレッジの問題を持っているでしょう私の例では

(どのようにしてください)そして、2つのlog.Fatal()は全く扱われていません。

私の質問は、どうやってテストを正確に行っているのですか?可能性のあるすべてのシナリオをテストしない、あまり厳格ではないか、PHPのようなアノテーションを行うことができますか? @expectedException \InvalidArgumentException main関数をテストすることはできますか?どういうわけかカバレッジツールから無視することはできますか?テストフレームワークを考慮する必要がありますか? ほとんどのテストチュートリアルは素敵ですが、非常に短く、簡単なテストを導入するだけです。

+2

100%カバレッジは有用な指標ではありません。 – JimB

+0

https://github.com/smartystreets/assertions helpful – Plato

+0

'readConfig'は非常に重要な方法のように見えますが、ファイルシステムとは独立したロジックをテストすることができます。 – dm03514

答えて

5

それはそれ自体は囲碁の事ではないのですが、それはあなたの好みに依存しますが、:

。テストしないでくださいmain。 mainはテストされたコードのみを呼び出すべきです。それらのパッケージに可能な限り多くのコードカバレッジを提供し、メインをできるだけ些細なものとして残してください。それはカバレッジに関係なく良い方法です。だからそれは本当に問題ではありません。

b。テスト可能なコードにlog.Fatalを使用しないでください。エラーを返すだけです。アプリケーションの初期化コードにlog.Fatalを保存することができます。つまり、main :)です。したがって、メインコールreadConfigが失敗した場合、エラーを返すだけです(非常にテスト可能です)。 log.Fatalの追加されたアプリケーションの動作は主な仕事です。構成リーダーは、アプリケーションを終了する必要があるかどうかを判断するようなものではありませんか?設定を読み込み、成功したかどうかを伝えます。アプリケーションはそれをどうするかを決めます。

だからあなたのコードは次のようになります。

func readConfig(path string) (Config, error) { 
    var cfg Config 
    file, err := ioutil.ReadFile(path) 
    if err != nil { 
     return cfg, err 
    } 
    err = json.Unmarshal(file, &cfg) 
    if err != nil { 
     return cfg, err 
    } 
    return cfg, nil 
} 

func main() { 
    config, err := readConfig("config.json") 
    if err != nil { 
     log.Fatal(err) 
    } 

} 

そして今、あなたは、アプリケーションの動作からロジックを分離しました、とreadConfigは完全にテスト可能です。

関連する問題