当然のことですが、私たち全員が研究開発に携われるわけではありません。しかし、それでも専門用語の一部を学ぶことはできます。JSL ユニット テスト フレームワークというフレーズがあります。それは何でしょうか? どのようにして生まれたのでしょうか? そして、なぜ重要なのでしょうか?
JSL ユニット テスト フレームワークの謎を解き明かしましょう。
この説明を提供してくれた、Advanced Analytics Testing のシニア マネージャー、Nicole Jones ( @Nicole_Jones ) に感謝します。
「ユニットという用語は、ソフトウェア製品のテスト可能な最小のコンポーネントを指し、ユニット テストという用語は、ユニットが期待どおりに動作することを確認するための検証プロセスです。ユニット テスト フレームワークという用語は、自動ユニット テストを容易にするために使用されるメカニズムを指すようになりました。」
主任研究統計学者の Joseph Morgan ( @joseph_morgan ) は、2005 年に統計テスト担当者として働き始めたときに、これらの用語を JMP に導入しました (現在は DOE グループに所属しています)。Joseph のバックグラウンドは、ソフトウェア エンジニアリングとコンピューター サイエンス、および離散数学と統計です。
「彼は、中心的なテスト フレームワークというコンセプト全体を考案しました」と、テスト エンジニアリング担当シニア マネージャーの Audrey Shull ( @Audrey_Shull ) は言います。「彼には素晴らしいアイデアがたくさんあり、これはその 1 つでした。」
「JMP と JSL に慣れると、ソフトウェアの統計的性質を念頭に置きながら、JSL ユニット テスト フレームワークを開発できるようになりました」と Nicole 氏は言います。
ジョセフ・モーガンが解説(4:38)
「自分たちのシャンパンを飲む」
ユニット テスト フレームワークは他の言語で記述することもできますが、独自の JSL よりも優れたツールがあるでしょうか?
JSL ユニット テスト フレームワークでは、「JMP を使用して JMP をテストしています」と Audrey 氏は説明します。言い換えれば、「自分たちでシャンパンを飲んでいる」ということです。しかし、これはすべてのツールで可能なわけではありません。
「この多用途の JSL 言語のおかげで、私たちはソフトウェアをテストするためにソフトウェアを使用することができます」と Audrey 氏は続けます。「フレームワークをサポートするために、JSL でできることの限界を広げています。これは非常に特別なことです。そしてフレームワーク自体は、JSL の下位互換性のための大規模な回帰テストとして機能します。」
「開発スタッフがスクリプトの動作方法を変更した場合、テスト グループが最初にそれを見つけます。なぜなら、私たちが JSL 言語の最初の顧客だからです。
「すべての企業が自動化を試みていますが、そのためにサードパーティのツールを使用することが多いです。自社のソフトウェアを使用できるほどの余裕が常にあるわけではありません。」
拡張可能なフレームワーク
A screenshot of the original dialog.元のダイアログのスクリーンショット。JSLユニット テスト フレームワークは、すべての JMP プラットフォームで使用されます。たとえば、グラフ ビルダーのドラッグ アンド ドロップ機能や、赤い三角形のメニュー、または Distribution プラットフォームの任意のコード ユニットをテストするために使用できます。
「JSL 自体をテストできるだけでなく、フレームワークを使用して他のすべてのプラットフォームをテストすることもできます」と Audrey 氏は言います。
ニコールは次のように詳しく説明します。
「ジョセフがフレームワークを開発していた当時、彼の主な焦点は、JMP の統計プラットフォーム用の回帰テスト スイートを作成する方法を見つけることでした。しかし、彼は拡張可能なフレームワークを作成することができました。回帰テスト スイートには、統計プラットフォームとグラフ作成プラットフォームが含まれており、Macintosh と Windows の両方で動作し、データ テーブル コマンドとレポート構造をテストします。」
「セーフティネット」を活用して作業する
フレームワークは手動で実行できます。テスターと開発者は起動し、ポイントしてクリックし、実行することができます。しかし、継続的な改善には自動化が鍵となります。
フレームワークは、開発者の作業が保存され、コードが実装される Perforce (作業リポジトリ) を通じて自動化されます。JMP テスターはテスト ケースを作成し、それを Perforce の専用セクションにアップロードします。
Screenshot of the testing dialog as it looks today.現在のテスト ダイアログのスクリーンショット。
主任システム開発者の Jim Borek が夜間に実行する自動化プロセスでは、その日にアップロードされたすべてのテストを取得し、その日にプッシュされたすべてのコードを取得し、更新されたコードでテスト ケースを実行し、何かが失敗した場合はチームに通知します。Jim は、このプロセスの自動化とマシンの保守の中心人物です。
Audrey は、行われているテストの膨大さについて説明しました。毎晩 240 万件のテストが実行されています。これは、JMP 17 と JMP 16.2 の両方で、すべてのオペレーティング システム (Windows、Catalina、BigSur など) で実行されています。1 台のマシンでテストを実行するプロセスには、マシンの速度に応じて 6 ~ 10 時間かかります。
「それが回帰テスト スイートです。このフレームワークがなければ、これらのものを毎日テストして、壊れていないかどうか確認しなければなりません」と Audrey 氏は言います。「手動ではできません。テスト スイートは自動化されており、障害が発生したことをシステムが警告します。」
「私たちはこれをセーフティネットと呼ぶことがあります。前回テストしたときにはうまくいったことがわかっていて、テストケースを書いて、もしシステムが壊れたら知らせてくれるので、他のことに進むことができます。私たちはソフトウェアに新しく追加されるものをテストしようとしています。」
JSL テスト フレームワークのワークフロー


Appleのバグを発見
Joseph は、ユニット テスト フレームワークの価値を確固たるものにした初期の逸話を共有します。
「JSL ユニット テスト フレームワークの最初の実装が稼働して間もなく、その価値がかなり珍しい形で劇的に明らかになりました。興味深いことに、検出されたのは JMP の回帰ではなく、MacOS のかなり深刻なバグを特定する鍵でした。
「2006 年初頭、Apple は Macintosh ラインを PowerPC CPU から Intel CPU に移行し始め、この移行を支援するために、MacOS に Rosetta と呼ばれるエミュレーターをバンドルしました。このエミュレーターにより、PowerPC アプリケーションを Intel Mac で実行できるようになり、Apple では重要なソフトウェアと見なされていました。
「結局のところ、Rosetta エミュレーターにバグがあり、JMP の動作にいくつかの異常が発生していました。ユニット テスト フレームワークを使用して、問題が Rosetta の平方根関数の実装のバグであることを特定することができました ( 欠陥 S0351925 を参照)。
「マイケル・ヘクトと私は、Apple のエンジニアと電話会議を何度か行い、問題を説明しましたが、エンジニアたちは JMP のバグだと主張し続けました。マイケルが、バグを露呈したユニット テストの 1 つを基本的に模倣した非常にシンプルな C++ アプリを書くよう私に提案して初めて、Apple はこの問題が Rosetta のバグであると確信しました。1 年後の 2007 年 3 月、Apple は Mac OS X 10.4.8 で Rosetta のバグに対する修正プログラムをリリースしました。」
誰が利益を得るのか?
「[フレームワーク] はテスターを念頭に置いて開発されましたが、開発者にとっても有用であることが証明されています」と Nicole 氏は言います。「私たちの多くのニーズに対応できるフレームワークを作成できた Joseph 氏の能力に感謝しています。」
ケーリーと北京にいるテスターは機能を分担し、JMP の特定の領域を監視します。しかし、JMP のどの部分のテストを担当しているかに関係なく、基本的に全員がスクリプト言語もテストしています。
Audrey 氏は、「JMP と JSL を使いこなせば使うほど、『あったらいいな』と思うようになります。実装するのは私たちではないのに、『これやあれを追加してもらえますか?』とお願いすることもあります」と述べています。
そして、継続的な改善は、もちろん、顧客にとっても利益となります。
「当社の JSL パワー ユーザーは、私たちが行っていることのいくつかを実行したいと考えるかもしれません。これにより、より堅牢な方法でスクリプトを作成する方法を考えるようになります。」
追加された多くの機能は、開発、テスト、リリース エンジニアリング チームからクラウドソーシングされました。
長年にわたり機能を追加してきた主要なプレーヤーに感謝します:
ジョセフ・モーガン@joseph_morgan
メラニー・ドレイク@Melanie_J_Drake
ジム・ボレック
ザン・グレッグ@XanGregg
マイケル・ヘクト@hecht_jmp
ジャスティン・チルトン@Justin_Chilton
エヴァン・マコークル@EvanMcCorkle
ニック・ホームズ@nickholmes13
これは、JMP 部門の創意工夫、協力、継続的な改善への取り組みを示す数多くの例の 1 つにすぎません。私たちは、このようなストーリーをもっと取り上げていきたいと考えています。アイデアがあれば、Jessica Marquardt までご連絡ください。
さらに詳しい情報を知りたいですか?
JMP テストダッシュボード
この投稿のインスピレーションとなったのは、テストエンジニアリングマネージャーの Nala Sun ( @Nala ) による中国 R&D ニュースレターの記事です: JSL ユニットテストの自動化フレームワーク
JSLユニットテストの結果がどのように出力され、処理され、夜間のユニットテスト実行に利用されるかは次のとおりです。JSL フレームワークデータパイプライン
ジョセフ・モーガンによる記事: JSL ユニット: 自動化された JSL テスト
Orso、Alessandro、Gregg Rothermel。「ソフトウェアテスト:研究紀行(2000~2014)」Future of Software Engineering Proceedings。2014年、117~132ページ。
Alex Orso のプロフェッショナル ページ: https://www.cc.gatech.edu/home/orso/
また、背景情報とガイダンスを提供してくれた@shannon_connersにも感謝します。