すべての単体テストを1回のヒットでコーディングする必要があります(私の意見では)。テストする必要があるものを具体的にカバーするテストのみを作成するという考えは正しいですが、特定の仕様では、0およびPIで機能するsine()
関数ではなく、機能する関数が必要です。sine()
十分に信頼できる情報源を見つけてください(数学者の友人、数学の本の裏にある表、またはすでに正弦関数が実装されている別のプログラム)。
手ですべてを入力するのが面倒なので、私はそれを選びましbash/bc
た:-)。関数の場合は、sine()
次のプログラムを実行してテストコードに貼り付けます。また、このスクリプトのコピーをコメントとしてそこに入れて、何かが変更された場合に再利用できるようにします(この場合、20度を超える場合の目的の解像度、または必要なPIの値など)。使用する)。
#!/bin/bash
d=0
while [[ ${d} -le 400 ]] ; do
r=$(echo "3.141592653589 * ${d} / 180" | bc -l)
s=$(echo "s(${r})" | bc -l)
echo "assertNear(${s},sine(${r})); // ${d} deg."
d=$(expr ${d} + 20)
done
これは以下を出力します:
assertNear(0,sine(0)); // 0 deg.
assertNear(.34202014332558591077,sine(.34906585039877777777)); // 20 deg.
assertNear(.64278760968640429167,sine(.69813170079755555555)); // 40 deg.
assertNear(.86602540378430644035,sine(1.04719755119633333333)); // 60 deg.
assertNear(.98480775301214683962,sine(1.39626340159511111111)); // 80 deg.
assertNear(.98480775301228458404,sine(1.74532925199388888888)); // 100 deg.
assertNear(.86602540378470305958,sine(2.09439510239266666666)); // 120 deg.
assertNear(.64278760968701194759,sine(2.44346095279144444444)); // 140 deg.
assertNear(.34202014332633131111,sine(2.79252680319022222222)); // 160 deg.
assertNear(.00000000000079323846,sine(3.14159265358900000000)); // 180 deg.
assertNear(-.34202014332484051044,sine(3.49065850398777777777)); // 200 deg.
assertNear(-.64278760968579663575,sine(3.83972435438655555555)); // 220 deg.
assertNear(-.86602540378390982112,sine(4.18879020478533333333)); // 240 deg.
assertNear(-.98480775301200909521,sine(4.53785605518411111111)); // 260 deg.
assertNear(-.98480775301242232845,sine(4.88692190558288888888)); // 280 deg.
assertNear(-.86602540378509967881,sine(5.23598775598166666666)); // 300 deg.
assertNear(-.64278760968761960351,sine(5.58505360638044444444)); // 320 deg.
assertNear(-.34202014332707671144,sine(5.93411945677922222222)); // 340 deg.
assertNear(-.00000000000158647692,sine(6.28318530717800000000)); // 360 deg.
assertNear(.34202014332409511011,sine(6.63225115757677777777)); // 380 deg.
assertNear(.64278760968518897983,sine(6.98131700797555555555)); // 400 deg.
明らかに、この答えを実際の関数の目的にマッピングする必要があります。私のポイントは、テストはこの反復でのコードの動作を完全に検証する必要があるということです。この反復でsine()
、0とPIに対してのみ機能する関数を生成する場合は、それで問題ありません。しかし、それは私の意見では反復の深刻な無駄になるでしょう。
関数が非常に複雑であるため、数回の反復で実行する必要がある場合があります。次に、アプローチ2が正しく、次の反復でテストを更新して、機能を追加する必要があります。それ以外の場合は、この反復のすべてのテストをすばやく追加する方法を見つけてください。そうすれば、実際のコードとテストコードを頻繁に切り替えることを心配する必要がなくなります。