Эффективная проверка кода на Python
Единственным надежным способом удостовериться в правильности работы программы является проведение тестирования. Одним из эффективных инструментов для проверки кода на Python является библиотека unittest.
Все, что нужно сделать - это создать класс, наследующий unittest.TestCase, задать его методы для проведения тестов (должны начинаться со слова test) и инициировать их запуск вызовом метода unittest.main. Если выполнение теста не сопровождается возбуждением исключений, то он считается пройденным.
Для вызова исключений unittest.TestCase предоставляет набор утверждений assertEqual (проверка равенства), assertTrue (проверка истинности) и ряд аналогичных конструкций, начинающихся с assert. Также в unittest.TestCase предусмотрено два служебных метода (setUp и tearDown) для проведения пред- и постобработки перед запуском каждого теста.
Например, для тестирования части функциональности парсера поединков в рамках турниров по смешанным единоборствам, проводимых организацией UFC, можно написать следующий класс (подробнее о параметрах читай здесь):
import unittest
from ufc.ufc_fights_parser import UFCFightsParser
class ScraperTest(unittest.TestCase):
true_vals_d={'cur_url':'http://www.ufcstats.com/event-details/fc9a9559a05f2704?',
'events_url':'http://www.ufcstats.com/statistics/events/completed?page=1',
'next_url':'http://www.ufcstats.com/event-details/33b2f68ef95252e0?',
'num_fights':'12'}
def setUp(self):
tag_container_events='tbody,,'
tag_event='a,class,b-link b-link_style_black'
tag_container_el = 'tbody,class,b-fight-details__table-body'
tag_el = 'a,class,b-flag b-flag_style_green'
cur_url = self.true_vals_d['cur_url']
events_url=self.true_vals_d['events_url']
page_param = 'page'
delay = 1
self.ufc_fights = UFCFightsParser(cur_url,events_url,delay,page_param,\
tag_container_events, tag_event,\
tag_container_el,tag_el)
def test_num_fights(self):
items_hrefs = self.ufc_fights.get_item_hrefs(self.ufc_fights.cur_url,\
self.ufc_fights.tag_container_el,self.ufc_fights.tag_el,\
self.ufc_fights.delay)
self.assertEqual(len(items_hrefs),int(self.true_vals_d['num_fights']))
def test_next_url(self):
self.assertEqual(self.true_vals_d['next_url'], self.ufc_fights.get_next_url())
if __name__=='__main__':
unittest.main()
Перед каждым тестом мы создаем объект класса UFCFightsParser в методе setUp, а затем в ходе их выполнения сравниваем возвращаемые значения (количество боев в турнире, ссылка на следующий турнир) с истинными, которые задаем в словаре true_vals_d класса ScraperTest. Выполнение методов ScraperTest, начинающихся с test, автоматически осуществляется после вызова unittest.main.