Goチームは、ファジーテストのサポートを追加する提案を受け入れました。
ますます広く使われるようになっています。クラウドネイティブソフトウェア、コンテナソフトウェア、コマンドラインツール、データベースなどで、Goが選ばれるようになりました。そのため、テストを書いたり実行したりするのはかなり簡単です。
ファジーテストとは何ですか?
意図しないデータをソフトウェアに入力することです。理想的には、そのようなテストはアプリケーションをクラッシュさせるか、意図しない動作をさせます。最終的な結果はさておき、プログラムが意図しない入力データを扱った結果から、多くの情報を得ることができます。
どのようなソフトウェアにも、さまざまなソースからの入力やデータを受け取るための指示があり、ソフトウェアはそれを処理して適切な結果を返します。ソフトウェアが開発されると、テストエンジニアのチームがそれをテストし、ソフトウェアのエラーを見つけ、テストレポートを提出し、修正します。通常、テストの目的は、ソフトウェアが期待通りに動作するかどうかを検証することです。テストは、機能テスト、統合テスト、性能テストなど、さまざまな種類にさらに細分化することができます。それぞれのテスト方法は、エラーを発見したり、信頼性や性能を向上させたりするために、ソフトウェアの機能の特定の側面に焦点を当てます。
ファジィテストは、「無効な」あるいは「ランダムな」データをソフトウェアプログラムに入力しようとすることで、このテストプロセスをさらに一歩進めます。この入力は意図的なものであり、望ましい結果はクラッシュまたは異常出力です。他のテストと同様に、ファズテストを手動で実行する必要はほとんどなく、このプロセスを自動化できるファズテストツールが業界には数多くあります。
Goによるソフトウェアテスト
例えば、add.goのAdd()関数をテストしたい場合、add_test.goでテストパッケージをインポートし、TestXXX()で始まる関数内にテスト本体を記述します。
次のコードを考えてみましょう:
func Add(num1, num2 int) int {
ファイルには次のようなテスト・コードがあります add_test.go
import "testing"func TestAdd(t *testing.T) {
テストを実行してください:
$ go test
ファジーテストのサポートを追加
Go チームは、この作業を進めるために ファジング テストのサポートを追加する提案を受け入れました。これには、新しい testing.F タイプの追加、_test.go ファイルの新しい FuzzXXX() 関数の追加、そしてこれらのテストを実行するための Go ツールの新しい -fuzz オプションが含まれます。
add_test.go
func FuzzAdd(f *testing.F) {
以下のコードを実行してください:
$ go test -fuzz
この記事を書いている時点では、この 機能はまだ実験的なものですが、1.18リリースには含まれるはずです。keepfuzzing、-raceなどの多くの機能もまだサポートされていません。Goチームは最近、 ファジング・テストに関するチュートリアルをリリースしました。
gotipをインストールして最新機能を入手
リリースされるこれらの機能をどうしても試したいのであれば、gotip を使って今後の Go リリースをテストし、フィードバックを与えることができます。以下のコマンドで gotip をインストールできます。一度インストールすれば、古い go プログラムの代わりに gotip を使ってプログラムをコンパイルしたり実行したりできます。
$ go install golang.org/dl/gotip@latest$ gotip download$ gotip versiongo version devel go1.18-f Thu Jan 6 linux/amd64
ファジー検査に対する地域社会の視点
ファジーテストは、ソフトウェアのコミュニティでよく議論され、人によって意見が異なります。ファジーテストは、バグを発見するための有用な技法であると考える人もいます。しかし、ファジーテストに必要なリソースを考えると、無駄だと考える人もいます。Goチーム内でも意見が分かれています。ご覧のように、Goの共同創設者であるRob Pikeは、ファジーテストの使用とGoへの実装について少し懐疑的です。
... ~Rob Pike
しかし、Goセキュリティチームのもう一人のメンバーであるFilo Sottile氏は、Goがファジングのサポートを追加することについて楽観的な見方をしているようで、それをサポートする多くの例を挙げ、ファジングが開発プロセスの一部になることを望んでいます。
ファジーテストの現実
私にとって、ファズテストはバグを発見し、システムをより安全で弾力性のあるものにする上で非常に効果的なようです。例えば、Linuxカーネルも ファジーテストチュートリアル ツールを使ってファズテストされており、 多くの バグが見つかっています。
Rob Pike 、C/C++で書かれたプログラムのための一般的なファジーテストツールでもあります。
Goにファズテストのネイティブサポートを追加する理由は何ですか?
プログラムをファズテストする必要があるのであれば、go-fuzzのようなツールで十分でしょう。上記のようなツールは開発者の負担を増やすだけでなく、機能が不足しているため、開発プロセスをよりシンプルにするためです。ファジーテストに出会ったことがないのであれば、設計草案を読むことをお勧めします。
開発者はgo-fuzzやfzgoのようなものを使って特定のニーズに対応することができます。しかし、存在するソリューションのそれぞれは、典型的な Go テストよりも多くを必要とし、重要な機能が欠けています。他のGoテストと比較して、ファジングテストが複雑であったり、機能が少なかったりするべきではありません。すでに存在するソリューションは、カスタム コマンド ライン ツールなどのオーバーヘッドを追加します。
ファジーテストツール
誰もがGo言語に追加されることを期待している機能のリストの中で、ファジーテストは人気のあるものです。まだ実験的なものですが、今後のリリースではより強力になるでしょう。そのため、ファジーテストを試すだけでなく、使用するシナリオを検討する時間は十分にあります。オーバーヘッドと見なすべきではなく、正しく使用すれば、バグを発見するための非常に効率的なテストツールになります。開発者はシンプルなファジーテストを書くことができ、テストチームはその力をフルに発揮できるように徐々に拡張していくことができます。





