2016-12-27 5 views
2

Рассмотрим следующий пример:Unittest - управляемые данными краевые тесты с объектами?

import unittest 

class MyClass: 
    def __init__(self, dict: {}): 
     try: 
      if self.validate_dict(dict): 
       self.data = dict 
     except Exception as e: 
      raise Exception('Unable to create MyClass: {}'.format(str(e))) 

    def validate_dict(self, dict: {}): 
     if 'special_key' not in dict: 
      raise Exception('Missing Key: special_key') 

     # ... perhaps more complicated validation code... 
     return True 

class MyTests(unittest.TestCase): 
    def test_bad_validation(self): 
     with self.assertRaises(Exception) as context: 
      test_dict = {} 
      test_class = MyClass(test_dict) 

     self.assertTrue('Unable to create' in str(context.exception)) 

... при условии, что это не страшно подход для модульного тестирования этой функции, как я мог бы добавить больше случаев испытания на UnitTest помимо всего {}?

Я чувствую, что было бы полезно увидеть хороший список всех тестовых случаев конкретного теста с первого взгляда и быстро добавить новые.

Я нашел библиотеку DDT, которая была создана для решения этой самой проблемы, но не кажется, что существует какой-либо способ передать весь объект, например, dict, в качестве тестового аргумента без его распаковки. В этом случае я хочу проверить наличие ключей (и их может быть много), поэтому распаковка их в отдельные аргументы, такие как DDT, кажется плохим решением.

Поддерживает ли unittest что-то вроде этого? Я знаю pytest, но я хотел посмотреть, что возможно с unittest.

Другие подходы к модульному тестированию этого кода также приветствуются.

ответ

1

Я считаю, что вы ищете метод subTest (добавлено в 3.4).

import unittest 

class MyClass: 
    def __init__(self, dic: {}): 
     try: 
      if self.validate_dict(dic): 
       self.data = dic 
     except KeyError as e: 
      raise ValueError('Unable to create MyClass: {}'.format(e)) 

    def validate_dict(self, dic): 
     if 'special_key' not in dic: 
      raise KeyError('Missing Key: special_key') 

     # ... perhaps more complicated validation code... 
     return True 

class MyTests(unittest.TestCase): 
    def test_bad_validation(self): 
     for test_dict in (
       {}, 
       {'a':1}, 
       {'b':2, 'else':3}, 
       {'special_key':4}, 
       ): 
      with self.subTest(test_dict=test_dict): 
       with self.assertRaises(Exception) as context: 
        MyClass(test_dict) 
       self.assertTrue('Unable to create' in str(context.exception)) 

unittest.main() 

В 3.6, это печатает, для случая, который не пропусканием проверки достоверности:

====================================================================== 
FAIL: test_bad_validation (__main__.MyTests) (test_dict={'special_key': 4}) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "F:\Python\mypy\tem2.py", line 23, in test_bad_validation 
    MyClass(test_dict) 
AssertionError: Exception not raised 

---------------------------------------------------------------------- 
Ran 1 test in 0.014s 

FAILED (failures=1) 
+0

прекрасно работает. Спасибо. – moogooloo

Смежные вопросы