python
February 5, 2021

Эффективная проверка кода на 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.