Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 3, 2017 17:26:20

frizbn
Зарегистрирован: 2017-01-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ищу ментора

Ищу наставника-ментора к которому можно обратиться с возникшим вопросом и получить развернутый, внятный ответ. Человека, которому интересно этим заниматься и готовому изредка уделять этому время.

Со своей стороны, готов предложить свое время и кое-какие умения для выполнение рутинных и, возможно, не самых интересных задач, которые стоят перед ментором.
Так же, рассмотрю предложения о платных консультациях.

Изучаю Python уже около полугода. Есть опыт работы с HTML/CSS; фреймворками Flask, Selenium; библиотеками requests, Beautiful Soup, docx, xlsxwriter; модулями re, json, os. Создавал ботов с tweepy и python-telegram-bot.
Сейчас активно ищу работу джиниор разработчика и пытаюсь побольше практиковаться.

На данный момент, есть небольшая программа, которая работает с Google Spreadsheets Python API (gspread) и выполняет несложный расчёт. Проблема, с которой столкнулся - это тестирование c помощью фреймворка py.test.

Мне удалось написать пару тестов, но не протестировать программу полностью. Все же, хотел бы хорошо разобраться и понять, как работать с py.test.
Линк на GitHub репозиторий.

Поэтому кто может помочь / подсказать / показать пишите в личку или в скайп (frizbn), буду Вам очень благодарен!

Отредактировано frizbn (Янв. 4, 2017 11:18:35)

Офлайн

#2 Янв. 3, 2017 18:23:36

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Ищу ментора

Советы:
- Уберите почту, пока боты не подхватили.
- Код программы желательно выложить, чтобы тому, кто надумает помогать сразу было понятно с чем он имеет дело.
- Напишите сразу, что читали / изучали / смотрели.
- Итоговые цели, которых хотите достичь тоже не помешают.

P.S. Удачи в поиске.

Отредактировано 4kpt_IV (Янв. 3, 2017 18:23:46)

Офлайн

#3 Янв. 4, 2017 11:19:31

frizbn
Зарегистрирован: 2017-01-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ищу ментора

4kpt_IV
Советы:- Уберите почту, пока боты не подхватили.- Код программы желательно выложить, чтобы тому, кто надумает помогать сразу было понятно с чем он имеет дело. - Напишите сразу, что читали / изучали / смотрели.- Итоговые цели, которых хотите достичь тоже не помешают.P.S. Удачи в поиске.
Спасибо! Исправил.

Офлайн

#4 Янв. 4, 2017 12:05:14

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ищу ментора

frizbn
В принципе код читаемый, но некоторых ваших находок я не понял, к примеру, что вы пытаетесь вот тут сделать?

    
        try:
            return int(cell.value) if cell.value not in "" else None
        except ValueError:
            return None
В логику происходящего я не вдавался, но могу сразу дать совет. Уберите принты. Они нужны только для отладки, и лучше сделать так, чтобы отладочная информация выводилась только по необходимости. Это можно сделать передачей ключа в параметры запуска или установкой флага в конфиге. И вообще лучше заюзать модуль logging и логгировать по-взрослому.
Насчет тестов, насколько я понимаю, ваш класс призван получать какую-то информацию по сети. Но тест вы пишите не для того, чтобы протестировать корректность работы сервиса от гугла или доступность сети, а для того, чтобы проверить логику своих собственных изысканий. Поэтому тестировать программу нужно на каких-то тестовых априорно правильных данных, приложенных к программе. А ваш класс должен реализовывать логику выбора источника данных. И вот когда вы зададитесь этим вопросом, вы получите более-менее гибкую архитектуру. Это, конечно, будет уже не один класс, который наивно реализует какие-то действия, а набор компонентов: компонент, который получает данные, компонент, который эти данные парсит и валидирует и т.д. И тогда вы сможете провести нормальное юнит-тестирование всех компонентов по отдельности в рамках их функционала, и интеграционное тестирование вашей программы на фейковых данных и на реальных данных внедряя в тестируемый класс нужные компоненты.



Отредактировано FishHook (Янв. 4, 2017 12:07:17)

Офлайн

#5 Янв. 4, 2017 13:25:46

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Ищу ментора

frizbn
Да. Код вменяем. Есть что поправить, но не критично. В общем-то хорошо.

Офлайн

#6 Янв. 5, 2017 11:36:05

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Ищу ментора

frizbn
Забыл написать, что с удовольствием помог бы, но тесты давно не писал. У нас для этого есть специальный человек

Офлайн

#7 Янв. 5, 2017 13:35:05

frizbn
Зарегистрирован: 2017-01-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ищу ментора

FishHook
frizbnВ принципе код читаемый, но некоторых ваших находок я не понял, к примеру, что вы пытаетесь вот тут сделать?
Спасибо! Действительно что-то перемудрил здесь. Исправил.

Вашу идею я понял, что-то похожее я и пытался реализовать. В файле test_main.py я создаю “лабораторную” ячейку на которой и тестирую написаный мной функционал.
Но сама реализация мне не нравиться, кажеться она избыточна, вот поэтому и хочу спросить совета у опытных тестировщиков, как это делать “правильно”.

Отредактировано frizbn (Янв. 5, 2017 13:36:45)

Офлайн

#8 Янв. 5, 2017 13:39:02

frizbn
Зарегистрирован: 2017-01-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ищу ментора

4kpt_IV
frizbnЗабыл написать, что с удовольствием помог бы, но тесты давно не писал. У нас для этого есть специальный человек
А этот прекрасный человек тут, случайно, не появляеться?

Офлайн

#9 Янв. 5, 2017 13:49:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ищу ментора

frizbn
Вы кажется не понимаете о чем я говорю. Вы пытаетесь сделать класс-комбайн, который и карандаши точит и член дрочит. Понятно, что у вас сложности с тестированием всего этого хозяйства. Сложности как раз и возникают потому, что одна сущность выполняет сразу много задач и у вас нет четкого понимания, как провести тестирования отдельных подзадач в одной большой задаче. Я предлагаю выделить отдельные компоненты согласно их функционалу. И уже из них собирать нужный вам класс.
Сейчас придумаю пример, погодите.



Офлайн

#10 Янв. 5, 2017 14:25:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ищу ментора

Допустим у нас есть задача принимать по сети xml-документ, содержащий структуру образовательного учреждения (из какого-нибудь сапа нам это выгружают), назовем его условно Школой, и вам нужно на основании этих данных вести учет средней успеваемости учеников по региону или еще какие-то данные собирать.
Что мы можем сделать? Мы делаем класс, который в ините принимает урл удаленного сервиса и реализует метод get_avg_rate. Вроде бы и все. Но давайте сделаем умнее.

Во-первых, у нас есть модели предметной области, которые описывают нашу Школу, классы в ней и учеников. Как-то так

    
class Student:
     def __init__(self):
          self.family = None
          self.name = None
          self.rate = None
   
class Group:
     def __init__(self):
         self.name = None
         self.students = [] 
   
class School:
    def __init__(self):
         self.groups =[]

наша задача (узнать среднюю оценку учеников) хорошо ложится на модель школы, поэтому этот метод мы и реализуем в школе

   
class School:
    def __init__(self):
         self.groups =[]
    def get_avg_rate(self):
       """some calculations""" 
       return

Как видите модели школы абсолютно все равно, откуда в ней возьмутся данные о классах и учениках, мы можем уже сейчас тестировать эту модель. Но нам надо все-таки подойти ближе к xml. И мы пишем класс, который… Нихрена, мы делаем абстрактный базовый класс, который представляет источник данных как таковой. Что нам нужно от источника данных? Чтобы он нам вернул объект класса School, и не важно где он его возьмет.

 class AbstactDataSource:
    __metaclass__ = ABCMeta
    @abstractmethod
    def get_school():
        pass

Для тестов не связанных с функционированием сети мы можем сделать класс, реализующий наш интерфейс источника данных

 class TestDataSource(AbstactDataSource):
    
    def get_school():
         school = School()
         school.add_group(....)
        # etc.

Далее, мы пишем реализацию источника данных на основе XML - XMLDataSource

 class XMLDataSource(AbstactDataSource):
    
   def __init__(self, xml):
        self.xml  = xml   
    def get_school():
         # parse xml here

и класс, который будет откуда-то получать XML-ку для источника данных

 class SoapClient:
    def __init__(self, url):
         self.url = url
    def get_xml():
         """ get data from url"""
         return xml_text

теперь собираем все вместе

 class SchoolAnalizer:  
      url =  "http://school.ru/soap"     
     def __init__(self):
          self.datasource = None
                  
     def set_datasource(self, datasource = None):
         if datasource:
               self.datasource = datasource
         else:
               client = SoapClient(self.url)
               self.datasource = XMLDataSource(client.get_xml())
            
     def get_avg_rate(self):
         school = self.datasource.get_school()       
         return school.get_avg_rate()  

Каждый из этих компонентов вы можете протестировать самостоятельно и независимо. Ну или в сборе, передавая в методы установки нужные компоненты.

 def test_analizer(self):
    with open("test.xml", "r") as xml:
          data = xml.read()    
          ds = XMLDataSource(data)
          analizer = SchoolAnalizer()
          analizer.set_datasource(ds)
          assert analizer.get_avg_rate() == 4.56




Отредактировано FishHook (Янв. 5, 2017 14:41:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version