Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PyCon Russia 2018 — Unit Testing
Search
Vadim Pushtaev
July 23, 2018
Programming
430
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PyCon Russia 2018 — Unit Testing
Vadim Pushtaev
July 23, 2018
More Decks by Vadim Pushtaev
See All by Vadim Pushtaev
Perl course (5), testing
vadimpushtaev
0
120
MR::Go::Admin::Test
vadimpushtaev
0
98
Perl course (4), testing
vadimpushtaev
0
130
Perl course (4), db
vadimpushtaev
0
240
Perl course (4), oop
vadimpushtaev
1
200
Perl course (4), mod
vadimpushtaev
0
210
Perl course (3), testing
vadimpushtaev
0
110
Perl course (3), db
vadimpushtaev
0
97
Perl course (3), oop
vadimpushtaev
0
120
Other Decks in Programming
See All in Programming
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
120
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
180
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
450
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
AIエージェントで 変わるAndroid開発環境
takahirom
2
770
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
380
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
210
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
340
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
270
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
130
5分で問診!Composer セキュリティ健康診断
codmoninc
0
820
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
380
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
A better future with KSS
kneath
240
18k
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
Agile that works and the tools we love
rasmusluckow
331
22k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
230
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.2k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
420
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
Transcript
UNIT TESTING Вадим Пуштаев
Принципы Реализация 02/34 Что мы хотим? План доклада
03/34 Что мы хотим?
Регрессия 04/34
Влияние на архитектуру 05/34
Понимание 06/34
Отладка 07/34
Комфорт 08/34
Принципы
f: X Y Test the interface, not the implemen- tation?
X Y 10/34
Test the interface, not the implemen- tation? Y f: X
Y X 11/34
Test first 12/34
Unit testing ≠ testing 13/34
14/34 unittest xUnit – SUnit – JUnit – RUnit →
RSpec – ...
unittest Meszaros, Gerard (2007) xUnit Test Patterns 15/34
Этапы теста Arrange Act Assert Setup Exercise Verify Teardown 16/34
Setup Память Файловая система База данных … 17/34
Гибкие параметры def create(dt=None): if dt is None: dt =
datetime.now() def download(requests_lib=None): if requests_lib is None: requests_lib = requests class Downloader: def __init__(self, config, logger): self._config = config self._logger = logger 18/34
19/34 mock from unittest import mock requests_lib = mock.MagicMock() requests_lib.get.return_value.status_code
= 404 @mock.patch('that.module.requests') def test_download(self, requests_lib): requests_lib.get.return_value.status_code = 404
20/34 Файловая система import tempfile� with tempfile.TemporaryFile() as f: f.write(b'Test
data\n') output = io.StringIO() output.write('Test data\n')
База данных Поддельная база 21/34
База данных Поддельная база SQLite 22/34
База данных Поддельная база SQLite Настоящая база 23/34
Данные в базе Копия реальной базы 24/34
Данные в базе Копия реальной базы Слепок реальной базы 25/34
Данные в базе Копия реальной базы Слепок реальной базы Вручную
подготовленные данные 26/34
Данные в базе Копия реальной базы Слепок реальной базы Вручную
подготовленные данные Пустая база 27/34
Данные в базе Копия реальной базы Слепок реальной базы Вручную
подготовленные данные Пустая база Фабрики 28/34
factory_boy import factory from . import models class UserFactory(factory.django.DjangoModelFactory): class
Meta: model = models.User first_name = factory.Sequence( lambda n: 'User #{}'.format(n) ) group = factory.SubFactory(GroupFactory) 29/34 user = UserFactory()
Транзакции setUp = BEGIN tearDown = ROLLBACK self.break_db() 30/34
def setUp(self): super(BaseTestCase, self).setUp() self._patchers = { 'etcd': patch('common.utils.etcd.Etcd.write'), 'celery':
patch('celery.current_app.send_task'), } self._patchers['etcd'].return_value = None self._patchers['celery'].return_value = True for patcher in self._patchers.values(): patcher.start() � Patchers 31/34
def assertDirExists(self, dir_path): self.assertTrue(os.path.isdir(dir_path)) def assertNotFileExists(self, file_path): self.assertFalse(os.path.exists(file_path)) def assertFileContent(self,
content, path): with open(path, 'rb') as fh: self.assertEqual(content, fh.read()) Custom asserts 32/34
@BaseTestCase.cases( ( 'dst', pytz.timezone('Europe/Moscow'), DT.utc(2011, 3, 27, 6, 12, 23),
# 10:12:23 (MSD) datetime.date(2011, 3, 27), ), ( 'no_dst', pytz.timezone('Europe/Moscow'), DT.utc(2016, 2, 7, 23, 43, 12), # 02:43:12 (MSK) datetime.date(2016, 2, 8), ), ) def test_date_of_time(self, timezone, dt, date): self.assertEqual(DT.date_of_time(dt, timezone), date) 33/34 Таблицы результатов https://bit.ly/2NvZdUT
Итого
Спасибо! @pushtaev @pythonetc Пуштаев Вадим
Тестирование приватного метода?
def count_german_letters(self): return len([ x for x in self._string if
self._is_german_letter(x) ]) def delete_german_letters(self): return ''.join( x for x in self._string if not self._is_german_letter(x) ) def _is_german_letter(self, c): return c in string.ascii_lowercase or c in 'ÄäÖöÜü ß'