0

非常に大きな浮動小数点数と非常に小さな浮動小数点数の両方で機能するコードを書いています (たとえば、1e-150 が有効な答えになる可能性があります)。これを単体テストするには、浮動小数点数を小数点以下の桁数ではなく有効数字の数と比較したいので、次のようにします。

import unittest as ut
from numpy.testing import assert_approx_equal

class newTestCase(ut.TestCase):
"""Extends the basic unittest TestCase."""

def assertSFAlmostEqual(self, a, b, places=7):
    """Uses numpy to test if two floats are the same but to a defined
    number of significant figures rather than decimal places.

    Args:
        a: float to be compared
        b: float to be compared
        places: number of significant figures to match. unittest default
        for assertAlmostEqual is 7, so 7 is the default here
    """
    if isinstance(a, float) != True or isinstance(b, float) != True:
        raise TypeError

    raised = False
    try:
        assert_approx_equal(a, b, significant=places)
    except:
        raised = True
    self.assertFalse(raised, "FLoats %g and %g are not equal to %i "
                     "significant figures" % (a, b, places))

これはうまくいくように見えますが、これを多くの場所で使用することを計画しているので、実際に正しく動作することを確認したいと思います. 私の質問は、これを最も賢明に行うにはどうすればよいですか? 単体テストを単体テストするための適切なメカニズムはありますか?

ここで答えになりそうなものを見つけました、

ユニットテストの方法

しかし、これがどのように機能するのかわかりません。

よろしくお願いします!

4

2 に答える 2

2

のサブクラスはunittest.TestCaseのクラスと同様であるため、そのメソッドが正常に機能するかどうかをチェックするを記述できます。unittest.TestCase

特に、テストに合格する数値と不​​合格になる数値のペアのセットを作成し、これらの入力を使用してメソッドを呼び出してassertSFAlmostEqual、テストが成功するか失敗するかを確認する必要があります。

リンクした回答はこれを行いますが、おそらく必要なものよりも複雑なソリューションです。たとえば、単純に次のように書きます。

import unittest


class MyBaseTestCase(unittest.TestCase):
    def assertSpec(self, thing):
        assert thing == 123


class TestMyTest(MyBaseTestCase):
    def test_failures(self):
        self.assertRaises(AssertionError, self.assertSpec, 121)

    def test_successes(self):
        self.assertSpec(123)

if __name__ == "__main__":
    unittest.main()

テストケースをサブクラス化するだけで、すべてのテストは、テストにassert*合格する/合格しないことがわかっている特定の引数を使用して、作成したメソッドを呼び出すだけです。


メソッドの現在の実装に関する注意事項assert*:

if isinstance(a, float) != True or isinstance(b, float) != True:

Trueまたはとの比較は避けてくださいFalse。あなたの場合、単に書くことができます:

if not isinstance(a, float) or not isinstance(b, float):
# or:
if not (isinstance(a, float) and isinstance(b, float))

どちらも読みやすいです。

raised = False
try:
    assert_approx_equal(a, b, significant=places)
except:
    raised = True

プレーンを使用して例外をキャッチしないexcept:でください。この場合、本当にAssertionError発生しただけをキャッチしたいassert_approx_equalので、次を使用する必要があります。

raised = False
try:
    assert_approx_equal(a, b, significant=places)
except AssertionError:
    raised = True

次に、raisedフラグの使用を避けることができます。このtry-exceptステートメントは、else例外が発生しなかった場合にのみ実行される句を許可します。

try:
    assert_approx_equal(a, b, significant=places)
except AssertionError:
    # here put the code to be executed when the assertion fails.
else:
    # here put the code to be executed when *no* exception was raised.
于 2013-09-09T09:35:32.400 に答える
0

1 つの方法は TDD (テスト駆動開発) です。

  1. 失敗するテストを書きます。
  2. コードがテストに合格するようにします。
  3. リファクタリング。
  4. 1へ。

ここで重要なのは、最初に失敗するテストを作成することです。

于 2014-01-10T18:24:26.970 に答える