У меня есть опыт программирования на C и Fortran, однако я пытался изучить Python и ориентацию на объекты.Чтобы помочь с некоторыми из моих проектов, я пытался определить некоторые дополнительные модульные тесты.
Я использовал модульный тест AssertAlmostEqual, но я обнаружил, что для больших чисел он работает не так хорошо, как работаетдо 7 знаков после запятой (я думаю).При тестировании больших показателей это становится немного бесполезным.Поэтому я попытался определить тест assertEqualSigFig для значащих цифр вместо десятичных знаков.Этот тест был основан на сообщении стека над потоком, однако я не могу найти исходное сообщение, боюсь.
Этот тест работает для целых чисел с плавающей точкой и логических значений, однако я хотел посмотреть, будет ли он работать и со сложными числами,Разбивая числа на действительные и мнимые компоненты, а затем вызывая себя.Когда это происходит, ошибка подтверждения не возникает, и я не уверен, почему.
Вот мой код:
import unittest
import math
class MyTestClass(unittest.TestCase):
"""
MyTestClass
Adds additional tests to the unit test module:
defines:
- AssertEqualSigFig
description:
- Used in place of the assertAlmostEqualTest, this tests two values
are the same to 7 significant figures (instead of decimal places)
args:
- any two integers, booleans, floats or complex number
returns:
- assertion error if not equal to defined significant figures
"""
def AssertEqualSigFig(self, expected, actual, sig_fig = 7):
if sig_fig < 1:
msg = "sig fig must be more than 1"
raise ValueError(msg)
try:
if isinstance(expected, bool):
if expected != actual:
raise AssertionError
else:
return
elif isinstance(expected, (int,float)):
pow_ex = int(math.floor(math.log(expected,10)))
pow_ac = int(math.floor(math.log(actual,10)))
tolerance = pow_ex - sig_fig + 1
tolerance = (10** tolerance)/2.0
if abs(expected - actual) > tolerance:
raise AssertionError
else:
return
elif isinstance(expected, complex):
#this part doesnt raise an error when it should
a_real = actual.real
a_imag = actual.imag
e_real = expected.real
e_imag = expected.imag
self.AssertEqualSigFig(self, a_imag, e_imag)
self.AssertEqualSigFig(self, a_real, e_real)
except AssertionError:
msg = "{0} ! = {1} to {2} sig fig".format(expected, actual, sig_fig)
raise AssertionError(msg)
Этот тест не пройден, если используются комплексные числа.Вот модульные тесты модульного теста, которые он не проходит:
import unittest
from MyTestClass import MyTestClass
class TestMyTestClass(MyTestClass):
def test_comlex_imag_NE(self):
a = complex(10,123455)
b = complex(10,123333)
self.assertRaises(AssertionError, self.AssertEqualSigFig, a, b)
def test_complex_real_NE(self):
a = complex(2222222,10)
b = complex(1111111,10)
self.assertRaises(AssertionError, self.AssertEqualSigFig, a, b)
if __name__ == "__main__":
unittest.main()
Я думаю, это потому, что вызов self.AssertEqualSigFig не вызывает ошибку.Я уверен, что есть глупость, которую я пропустил, но я все еще учусь.Кто-нибудь может помочь?