styleru.py lecture 3

ilebedev

			styleru.py
		

Сегодня в программе

Тестирование

Тестирование

Автоматические тесты

Автоматические тесты

Автоматические тесты (google)

см. "Как тестируют в Google", ссылка на книгу есть в материалах.

Автоматические тесты (google)

Автоматические тесты (google)

Тестирование в Python

Батарейки для тестирования:

Тестирование в Python

Батарейки для тестирования:

Пример

# validators.py
def is_valid_email(email):
    return '@' in email
		

Пример

# validators.py
def is_valid_email(email):
    return '@' in email

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

Пример

# tests.py
import unittest
from validators import is_valid_email
class EmailValidatorTestCase(unitttest.TestCase):
	def test_validates_valid_email(self):
		actual_result = is_valid_email('valid.email@gmail.com')
		self.assertTrue(actual_result)
	def test_invalidates_invalid_email(self):
		actual_result = is_valid_email('invalid.email')
		self.assertFalse(actual_result)
		

assert* в unittest

assertEqual(a, b)		assertIsNone(x)
assertNotEqual(a, b)	assertIsNotNone(x)
assertTrue(x)    		assertIn(a, b)
assertFalse(x)  		assertNotIn(a, b)
assertIs(a, b) 			assertIsInstance(a, b)
assertIsNot(a, b)		assertNotIsInstance(a, b)

assert* в unittest

assertEqual(a, b)		assertIsNone(x)
assertNotEqual(a, b)	assertIsNotNone(x)
assertTrue(x)    		assertIn(a, b)
assertFalse(x)  		assertNotIn(a, b)
assertIs(a, b) 			assertIsInstance(a, b)
assertIsNot(a, b)		assertNotIsInstance(a, b)
https://docs.python.org/2/library/unittest.html

Каким должен быть маленький тест

Покрытие тестами

Зачем это всё?

Гит

План рассказа

История одной курсовой работы

История другой курсовой работы

Системы контроля версий

Какие системы бывают

Какие системы бывают

Почему git

Где хранить

Командный минимум

            >> git clone https://github.com/YuriyOrlov/paper.git
        

Командный минимум

            
>> git status
>> Changes not staged for commit:
     (use "git add ..." to update what will be committed)
     (use "git checkout -- ..." to discard changes in working directory)

       modified:   index.html

   Untracked files:
     (use "git add ..." to include in what will be committed)

       user_profile.html

   no changes added to commit (use "git add" and/or "git commit -a")
            

Командный минимум

            >> git add user_profile.html>
>> Changes to be committed:
  (use "git reset HEAD ..." to unstage)

    new file:   user_profile.html

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

    modified:   index.html
            
        

Командный минимум

  • add - проиндексировать изменения
  •             >> git add user_profile.html
    >> Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
        new file:   user_profile.html
    
    Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git checkout -- ..." to discard changes in working directory)
    
        modified:   index.html
                
            

    Командный минимум

                >> git add .
    >> Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
        modified:   index.html
        new file:   user_profile.html
                
            

    Командный минимум

                >> git commit
            

    Командный минимум

  • commit - зафиксировать изменения
  •             >> git commit -m 'add user profile page'
            

    Командный минимум

  • commit - зафиксировать изменения
  •             >> git commit -m 'add user profile page'
       [master ff1cf60] add user profile page
        2 files changed, 2 insertions(+), 2 deletions(-)
        create mode 100644 user_profile.html
            

    Командный минимум

                >> git push
            

    Командный минимум

  • push - отправить изменения в удалённый репозиторий
  •             >> git push origin development
            

    Командный минимум

                >> git pull origin development
    >> Counting objects: 4, done.
       Delta compression using up to 4 threads.
       Compressing objects: 100% (3/3), done.
       Writing objects: 100% (4/4), 374 bytes | 0 bytes/s, done.
       Total 4 (delta 2), reused 0 (delta 0)
       remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
       To git@github.com:kazauwa/20_mood.git
          51604c0..ff1cf60  master -> master
            

    Командный минимум

                >> git log
            

    Ветки

    Ветки

    Ветки

    Ветки

    Ветки

    Ветки

    Команды для работы с ветками

    Лайфхак для работы с ветками

    Пулл реквест

    Пулл реквест

    Пулл реквест

    Сделать пул реквест проще, чем кажется

    Случай из жизни

    Тебе дали задание: воспользоваться методами АПИ внешнего сервиса, которых нет.
    Твои действия?

    Случай из жизни

    Тебе дали задание: воспользоваться методами АПИ внешнего сервиса, которых нет.
    Твои действия?

    Случай из жизни

    Вы с одногруппником вдвоём делаете учебный проект. Поделили задачи пополам, ты свою часть сделал, товарищ – нет.
    Твои действия?

    Случай из жизни

    Вы с одногруппником вдвоём делаете учебный проект. Поделили задачи пополам, ты свою часть сделал, товарищ – нет.
    Твои действия?

    Случай из жизни

    В качестве курсовой ты сделал проект, который парсит аудио из Вконтакте и строит рекомендательную систему.
    За три дня до защиты Вконтакте закрывает доступ к аудио через АПИ.
    Твои действия?

    Случай из жизни

    В качестве курсовой ты сделал проект, который парсит аудио из Вконтакте и строит рекомендательную систему.
    За три дня до защиты Вконтакте закрывает доступ к аудио через АПИ.
    Твои действия?

    Случай из жизни

    Ты сдал работу, препод обещал её проверить, но уже неделю молчит.
    Твои действия?

    Случай из жизни

    Ты сдал работу, препод обещал её проверить, но уже неделю молчит.
    Твои действия?

    И чё