2016-10-02 5 views
2

У меня есть класс с некоторыми @staticmethod, которые являются процедурами, поэтому они ничего не возвращают/их тип возврата - None.Python: как создать положительный тест для процедур?

Если они не работают во время их выполнения, они бросают Exception.

Я хочу unittest этот класс, но я борюсь с проектированием положительных тестов.

Для отрицательных тестов эта задача проста:

assertRaises(ValueError, my_static_method(*args)) 
assertRaises(MyCustomException, my_static_method(*args)) 

... но как создать положительные тесты? Должен ли я перепроектировать мои процедуры, чтобы всегда возвращать True после выполнения, чтобы я мог использовать assertTrue?

+2

Просто вызовите функцию без каких-либо утверждений. Если это исключает исключение, тест завершится неудачей. – zvone

+1

Итак, если процедура _doesn't_ вызывает исключение, это удалось? Затем просто вызовите процедуру _without_ try/catch wrapper. –

+0

Да; если процедура * не * вызывает исключение, это удалось. Если возникает исключение, оно захватывается другими классами, которые используют процедуры. Таким образом, любое исключение будет выбрано методом unittest, если произойдет что-то плохое. – daniel451

ответ

1

Не видя реальный код, что трудно угадать, однако я буду делать некоторые предположения:

  1. Логика в статических методах является детерминированным.
  2. После выполнения некоторых вычислений на входном значении появляется результат , и с этим результатом выполняется некоторая операция.
  3. python3.4 (макет эволюционировала и переехала в течение последних нескольких версий)

Для того, чтобы проверить код один должен проверить, что по крайней мере, в конце концов, он производит ожидаемые результаты. Если нет возвращаемого значения, результат обычно сохраняется или отправляется где-то. В этом случае мы можем проверить, что метод, который хранит или отправляет результат, вызывается с ожидаемыми аргументами.

Это может быть сделано с помощью инструментов, доступных в пакете mock, который стал частью пакета unittest.

например. следующий статический метод в my_package/my_module.py:

import uuid 

class MyClass: 

    @staticmethod 
    def my_procedure(value): 
     if isinstance(value, str): 
      prefix = 'string' 
     else: 
      prefix = 'other' 

     with open('/tmp/%s_%s' % (prefix, uuid.uuid4()), 'w') as f: 
      f.write(value) 

В тестовом модуле я проверить следующее:

  1. open был назван.
  2. Ожидаемое имя файла было рассчитано.
  3. open был вызван в write режиме.
  4. Метод дескриптора файла был вызван с ожидаемым аргументом.

UnitTest:

import unittest 
from unittest.mock import patch 

from my_package.my_module import MyClass 


class MyClassTest(unittest.TestCase): 
    @patch('my_package.my_module.open', create=True) 
    def test_my_procedure(self, open_mock): 
     write_mock = open_mock.return_value.write 
     MyClass.my_procedure('test') 
     self.assertTrue(open_mock.call_count, 1) 
     file_name, mode = open_mock.call_args[0] 
     self.assertTrue(file_name.startswith('/tmp/string_')) 
     self.assertEqual(mode, 'w') 
     self.assertTrue(write_mock.called_once_with('test')) 
1

Если ваши методы что-то делают, я уверен, что там должна быть логика. Давайте рассмотрим этот фиктивный пример:

cool = None 

def my_static_method(something): 
    try: 
     cool = int(something) 
    except ValueError: 
     # logs here 

для отрицательного теста мы имеем:

assertRaises(ValueError, my_static_method(*args))  

и possitive теста можно проверить прохладно:

assertIsNotNone(cool) 

Так вы проверяете, если применение my_static_method влияет на cool.