2016-09-19 30 views
2

は、私は、フォームの簡単な関数があるだろう:ユニットテストは非常に単純な関数

def test_square(self): 
     for _ in range(50): 
      rand_num = random.uniform(-10,10) 
      self.assertAlmostEqual(square(rand_num), rand_num**2, msg= "Failed for input: {}".format(rand_num)) 
:、私は正確さをテストするためのユニットテストを書く場合

def square(x): 
    return x**2 

をそのような何かを悪い習慣を考えられています

マニュアルケースを書くのではなく、単なるユニットテストの中で関数を書き直していますか?なぜ、または、なぜこれが良い習慣とはみなされないのでしょうか。

私は無効な入力やものをチェックする他のテストがあると仮定しています。私は、関数の正確性をテストする非常に特殊なケースについてこれを求めています。

+0

を持っている[。この質問は、プログラマが交換をスタックに適しかもしれません](https://programmers.stackexchange.com/)ユニットテストがあまりにも複雑になり何と皮肉なことに、単純な区別ではありません。 – AlexLordThorsen

+0

入力していただきありがとうございます。私の質問は、単体テストを一般的にどの程度複雑にするのではなく、正しさをテストする関数のコードをそのままコピーするかどうかです。 – 7VoltCrayon

+1

ユニットテストの私の個人的な基準は、「正解のテスト」、「負のテスト」、「システム障害の基礎テスト」、「前提の証明」、「エラーパス」などです。機能とその機能の側面に分解されています。オーバーラップは複雑すぎます。 – AlexLordThorsen

答えて

5

ランダム入力はほとんどあなたが望むものではありません。テストで生成されたランダムな入力が異なるため、テストが成功したにもかかわらず他のテストで失敗した場合はあまり役に立ちません。

正しい結果が得られるようにテストする必要があります。バグや回帰がある場合は、必要に応じて追加のテストを追加します。

これは、試験(すなわちそれだけ計算9なく3**2含む)任意の特定の実装の詳細に依存しないことが十分

def test(): 
    assert square(3) == 9 

注意あろう。一般的に、できるだけ依存性と複雑さが最小限に抑えられたテストが必要です。一般に、一度に1つのことをテストしようとしており、依存性が少ないということは、依存関係とのやりとりではなく、実際にテストしていることを意味します。あなたが負の数のバグに気づいた場合

、あなたは、彼らがすでに機能を開発した後、人々は、ユニットテストを追加するか、追加のテスト

しばしば
def test(): 
    assert square(3) == 9 
    assert square(-3) == 9 

を追加することができたり、彼らがしようとするでしょう最初からすぐにユニットテスト機能全体を作成してください。

一番良い方法は、一度に1つのフィーチャをテストし、一度に1つのフィーチャを追加し、テストと機能を一緒に開発することです。

+0

ありがとう、私の質問は、入力のランダムな性質とそれ以上のことについてはあまりありませんね。assert square(3)== 9あなたが言いましたか、x = 3、assert square(x)= x ** 2のようです。右側の式が少し複雑になる場合があります(乗算と加算が2つあります)。私は手動で出力の期待値をRHSに入れますか?またはexpectedFunctionをそこに書き直すことができますか?expectedFunctionは既知の動作インプリメンテーションです – 7VoltCrayon

+0

@ 7VoltCrayon一般的に、ユニットテストにできるだけ依存性が少なく、複雑さは、通常は1つのことをテストしようとしているため、テストに含まれる変数の数が少ないほどエラーの可能性が少なくなります。あなたの例では、可能であれば、ハードコードされた計算された出力をテストに含めるだけで、同じ結果を生成する実装をコーディングしようとはしません。 –

+0

あなたのコメントは実際に私が求めていた質問に対する答えの種類です。答えに追加することはできますか? – 7VoltCrayon

2

あなたのコードをそのままテストにコピーすることで、実際には何の前提もチェックされていません。その時点での同音異義語です。ユニットテストをtest input,function outputexpected outputに分割すると、実際の実装とどのように機能するかをテストしています。

assert function(input) == function(input) 

以来

は、テストスーツは、それらが導入されている場合でも回帰を報告することはありませんので、あなたが実際に自分自身を傷つけている、常に真です。

+0

良い点ですが、誤ってx ** 3を返すように四角関数を変更した場合はどうなりますか?これらのテストはそのような場合に有用でしょうか? 1つのわずかな違いは、関数(x)== ExpectedFunction(x)をテストすることです。ここで、ExpectedFunctionは既知の望ましい出力です。 – 7VoltCrayon

+1

予想される結果をハードコーディングした場合(つまりinput = 2、output = 4、3 == 9、...)、コードが乱れてしまった場合、それは壊れて見えます。 [それは私がpy.testをパラメータ化するようなものを使用する理由である、自分自身を繰り返すのはうんざりです(https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8# q = pytest%20parameterize) – AlexLordThorsen

+0

[特定の入力と出力をテストし、テストで最小限のコードを生成することは可能です](https://stackoverflow.com/questions/37552629/double-parameterization) – AlexLordThorsen

0

property base testingを使用してテストを作成しようとしています。これは、アルゴリズムをテストする有効な方法です。 Haskell.quickcheckが最初の実装です。

(指定されたプロパティ空間で)乱数を生成することに加えて、失敗したテストのデバッグを簡単にできるように、セットを減らします。

あなたは幸運である:PythonはQuickCheck

関連する問題