私は現在、独自のプログラミング言語を実装しています。今まで私は書いてきました:
入力ソースコードの処理中に発生した(スローされる)エラーのError
クラス。
いくつかのSyntaxError
関数(それぞれが異なるタグを持ち、SyntaxError<malformed_number>()
やSyntaxError<unexpected_symbol>
などのテンプレートで渡されます)は、異なるエラーメッセージを持つError
オブジェクトの構築に役立ちます(今のところ私はこれしか持っていませんが、すぐにFunctionError
s、IndexError
sなどがあります);
各トークンに関する情報を含むToken
クラス(トークンが検出されたときの文字列の行、タイプはstring
、number
.. ..そういうもの);
最後に、ソースコードの文字列を入力として受け取り、std::list<Token*>
オブジェクトを返すlexer
関数。内部的には、いくつかのヘルパー関数(buildname
、builsymbol
、skipcomment
...)を使用して、コードを整理します。
私はこれをコーディングする特定のプログラミング手法には従いませんでしたが、今ではTest DevelopementProgrammingという名前の手法に従う衝動を感じています。
しかし、私にはいくつかの懸念があります。
まず、上記のコードで何をテストする必要がありますか?もちろん、lexer
関数は徹底的にテストする必要があり、おそらくそれが使用するヘルパー関数もテストする必要があります(私は推測します)が、他のものはどうですか?
次に、重要な出力で関数をテストするにはどうすればよいですか?オンラインでは、単純な数値や文字列を比較する例がたくさんありますが、1つのテストケースに多くのことを書かなくても、オブジェクトへのポインタのリストを返す関数のテストをどのように書くのでしょうか。
TDDはテストではありませんが、codingテクニックです。ここで尋ねる必要のある質問は
「このクラスをテストしませんか」
だが
「コードベースに小さなchangeを実装したいのですが、変更前は赤で、変更後は緑になるテストを作成するにはどうすればよいですか?」
たとえば、小さな変更として、プログラミング言語での新しい「予約語」の導入が考えられます。レクサーのテストを作成して、このための特別なトークンを返しますが、機能を実装していないため、テストは失敗します。次に、機能を実装します-テストは緑色になります。次に、コードをリファクタリングし、テストを再実行します。エラーが発生したため、コードが赤になります。そのエラーを修正すると、テストが緑色になります。次の機能:特に間違った方法で新しい予約語を使用すると、SyntaxError
例外が返されます-これに対する新しいテストを記述してください----あなたはその考えを理解したと思います。
ご覧のとおり、既存のコードベースがあるかどうかにかかわらず、TDDを適用することは実際には重要ではありません-TDDは、コードベースに対してchangesを検証することであり、それぞれのコードベース全体をテストすることではありません。あらゆる方法で。
もちろん、「TDDテスト容易性」を考慮せずにコードベースを記述した場合、特定の変更に対するテストを記述しにくくなる可能性があります。したがって、本当にTDDに切り替えたい場合は、これを早期に行う方が簡単な場合があります。