Как провести модульное тестирование или имитацию метода класса с помощью TensorFlow hparams
Я хочу либо смоделировать, либо написать модульный тест для метода класса, когдаhparams
Модуль в TensorFlow используется для передачи аргументов ключевого слова методу класса. Я просмотрел несколько вопросов и ответов здесь (в StackOverFlow) о том, как "имитировать" или "тестировать" методы класса в Python, но все еще не могу заставить этот пример работать. Мой код выглядит следующим образом:
from tensorflow.contrib.training.python.training import hparam
def create_parser():
parser = argparse.ArgumentParser()
parser.add_argument('--iter', help='Number of iteration', default= 50, type=object)
parser.add_argument('--nclasses', help='Number of classes', default=3, type=int)
args = parser.parse_args()
h_params = hparam.HParams(**args.__dict__)
return h_params
# Class to use hparams returned from the create_parser function
class MainProgFile(object):
def build_params(self, hparams):
return hparams.iter + 40, hparams.nclasses * 2
if __name__ == '__main__':
# call function and pass HPARAMS
HPARAMS = create_arg_parse_parameters()
b_iter, mod_p = MainProgFile().build_params(HPARAMS)
И написал следующий класс unittest для build_params
метод:
class TestMainProgFile(unittest.TestCase):
def test_build_params(self)
kwargs = {'nclasses': 2, 'iter': 40}
n_cnt, w_class = m.build_params(*kwargs)
self.assertEquals(n_cnt, 42)
self.assertEquals(w_class, 80)
Но получил следующее сообщение: TypeError: build_params() takes 2 positional arguments but 3 were given
Также попробовал добавить декоратор патча: @patch('MainProgFile.build_params')
на build_params
функция, но также не мог проверить или "смоделировать" функцию. Я также пробовал использовать функцию параметризации pytest следующим образом:
@pytest.mark.parametrize("kwargs, expecting", [({'iter': 5}, [55, [(4, 5), (1, 5), (5, 3), (1, 3)]),
({'nclasses': 3}, [55, [(4, 5), (1, 5), (5, 3), (1, 3)]]), ])
def test_build_params2(self, kwargs, expecting):
m = MainProgFile()
assert m.build(**kwargs) == expecting
Но появилось следующее сообщение об ошибке:
def run(self, result=None):
orig_result = result
if result is None:
result = self.defaultTestResult()
startTestRun = getattr(result, 'startTestRun', None)
if startTestRun is not None:
startTestRun()
result.startTest(self)
testMethod = getattr(self, self._testMethodName)
if (getattr(self.__class__, "__unittest_skip__", False) or
getattr(testMethod, "__unittest_skip__", False)):
# If the class or method was skipped.
try:
skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
or getattr(testMethod, '__unittest_skip_why__', ''))
self._addSkip(result, self, skip_why)
finally:
result.stopTest(self)
return
expecting_failure_method = getattr(testMethod,
"__unittest_expecting_failure__", False)
expecting_failure_class = getattr(self,
"__unittest_expecting_failure__", False)
expecting_failure = expecting_failure_class or expecting_failure_method
outcome = _Outcome(result)
try:
self._outcome = outcome
with outcome.testPartExecutor(self):
self.setUp()
if outcome.success:
outcome.expecting_failure = expecting_failure
with outcome.testPartExecutor(self, isTest=True):
> testMethod()
E TypeError: test_build_mlp_structure() missing 2 required positional arguments: 'kwargs' and 'expecting'
../../../miniconda3/envs/myenv/lib/python3.6/unittest/case.py:605: TypeError
Любая помощь будет оценена по достоинству.