2017-02-17 3 views
1

Это мой первый раз, когда мы играем с утилизацией Python для задания в школе. У меня в основном есть объект Circle, где я использую pyunit, чтобы убедиться, что данные хранятся правильно.Python unittest подсчитывает количество тестов

Я заметил, что Python учитывает количество методов в качестве тестовых случаев, а не число утверждений assert.

Например, я хочу проверить, что методы работают правильно, Python считает только 2 теста, несмотря на наличие 4 утверждений assert. Это действительно разозлило меня, так как с JUnit Java он будет подсчитывать количество утверждений assert.

def test_xcrd(self): 
    self.assertTrue(self.point.xcrd() == 1) 
    self.assertFalse(self.point.xcrd() == 5) 

def test_ycrd(self): 
    self.assertTrue(self.point.ycrd() == 2) 
    self.assertFalse(self.point.ycrd() == 10) 

Что такое «норма» в python? Должна ли быть только одна заявляющая инструкция для каждого метода?

+1

«как с JUnit Java, он будет подсчитывать количество утверждений assert, а не» - что? С каких пор? – user2357112

+0

В прошлом опыте, если у меня есть @Test выше методов, которые я хочу проверить, все утверждения утверждения в соответствующем методе будут отображаться на панели JUnit Testing Eclipse. Например, метод с 4 утверждениями, написанными на Java, - все четыре утверждения будут отображаться в Eclipse. Эти же утверждения, написанные на Python, с пинитом, говорят «Ran 1 test in 0.001s, OK». –

+1

'pyunit' - это сторонний модуль тестирования, отличный от модуля' unittest', который поставляется с CPython в стандартной библиотеке. Если вы используете 'unittest', тогда вы должны отредактировать текст, чтобы удалить« pyunit »и« pyunit ». Если вы разместили файл MCVE https://stackoverflow.com/help/mcve, не было бы вопроса о том, какой модуль вы используете. –

ответ

2

Пакет Python's unittest позволяет структурировать ваши юнит-тесты различными методами, например, вы замечаете. Это полезно в тех случаях, когда вы хотите проверить те вещи, которые очень тесно связаны и не требуют отдельных модульных тестов.

unittest тесты начинаются с подкласса unittest.Test, а затем добавляются методы для этого. Таким образом, вы можете добавить несколько уровней разделения между различными unittests, которые более менее связаны.

Пример из Python Docs демонстрирует то, что считается оптимальным для модульных тестов Python:

import unittest 

class TestStringMethods(unittest.TestCase): 

    def test_upper(self): 
     self.assertEqual('foo'.upper(), 'FOO') 

    def test_isupper(self): 
     self.assertTrue('FOO'.isupper()) 
     self.assertFalse('Foo'.isupper()) 

    def test_split(self): 
     s = 'hello world' 
     self.assertEqual(s.split(), ['hello', 'world']) 
     # check that s.split fails when the separator is not a string 
     with self.assertRaises(TypeError): 
      s.split(2) 

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

Есть ряд вещей, которые вы можете наблюдать здесь:

  1. три метода TestStringMethods - это отдельные unittests.
  2. test_isupper и test_split оба содержат два утверждения, так как они очень тесно связаны. Добавление отдельных тестов для двух утверждений, присутствующих в test_isupper, добавило бы много раздувания в код, и это может привести к очень странным проблемам.

Например, если str.isupper() сломается странным образом, единственный unittest, покрывающий эту единственную функцию, сломается. Однако, если два теста для "FOO" и "Foo" были отдельными, один тест мог пройти, а другой - неудачный. Таким образом, тестирование функциональности одной функции лучше сохраняется в одном unittest с несколькими утверждениями.

То же самое относится к методу test_split; проверяя, что str.split() работает и проверяет, что он поднимает TypeError, тесно связан, и поэтому его лучше всего держать вместе в коде.

Итак, вернемся к вашему вопросу: может (и иногда должно) быть более одного утверждения в отношении метода, поскольку оно приводит к более простому и понятному коду и меньше путаницы. Процитировать «Zen of Python» (найденный путем запуска import this в оболочке python): «Простой лучше, чем сложный». Таким образом, сохраните ваши unittests простые и структурированные путем группировки подобных утверждений одним способом.

0

Ответ на ваш вопрос «Что такое« норма »в python? Должен ли быть только один утвердительный оператор в каждом методе? »-« Нет ». Некоторые люди могут сказать «да», но основные разработчики CPython, включая меня, регулярно используют несколько утверждений в методах тестирования.Посмотрите файлы test_xyz в Lib/test (если ваша установка включает этот каталог).

Это правда, что один метод должен проверять одно устройство или даже одно поведение одного устройства.

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