Slide 1

Slide 1 text

ͪΌΜͱ࣮૷ͯ͠ 
 ͪΌΜͱςετ͠Α͏ 2019-10-12 (PyCon mini Hiroshima 2019)
 ௕୩৔ ५໵

Slide 2

Slide 2 text

ࣗݾ঺հ • ௕୩৔ ५໵ (͸ͤ͹ ͡ΎΜ΍) • ֤छSNSͰ͸ 7pairs Ͱ׆ಈத • ޷͖ͳେࡕۅӂ͸தଜ߶໵ / ޷͖ͳ෋࢜େֶ͸֎࡚मଡ • ͓࢓ࣄͰ͸Android (Java / Kotlin) / iOS (Objective-C / Swift) ͕த৺ • ͋·ΓҰൠతͱ͸ݴ͑ͳ͍Pythonͷ࢖͍ํΛ໛ࡧ͢Δͷ͕େ޷͖ • PyCon JPͰAltJS (2018) / Android (2019) ʹ͍ͭͯൃද • https://speakerdeck.com/7pairs

Slide 3

Slide 3 text

޿ౡͰͷొஃ (4೥ͿΓ2ճ໨) • ৽ਓڭҭͱPython (2015) • https://speakerdeck.com/7pairs/pycon-mini- hiroshima-2015 • ͪΌΜͱ࣮૷ͯͪ͠ΌΜͱςετ͠Α͏ (←New!) • https://speakerdeck.com/7pairs/pycon-mini- hiroshima-2019

Slide 4

Slide 4 text

ஶॻ Chalice, Transcrypt, pytest, SeleneΛར༻ͯ͠
 αʔόʔϨεΞϓϦΛ࣮૷ɾςετ͢ΔຊͰ͢ AmazonଞͰઈࢍൢചதʂ

Slide 5

Slide 5 text

͜ͷηογϣϯͰ࿩͢͜ͱ • ͪΌΜͱςετ͢Δͱ͸Ͳ͏͍͏͜ͱ͔ʁ • ͪΌΜͱςετ͢ΔͨΊʹ 
 Ͳ͏࣮૷͢΂͖͔ʁ

Slide 6

Slide 6 text

͜ͷηογϣϯͰ࿩͞ͳ͍͜ͱ • ݸผͷςετπʔϧͷৄࡉʹ͍ͭͯ • ݸผͷCI / CDπʔϧͷৄࡉʹ͍ͭͯ

Slide 7

Slide 7 text

͜ͷηογϣϯͷΰʔϧ • ιϑτ΢ΣΞςετʹ͍ͭͯ 
 ཧղ͍ͯͨͩ͘͠ • ඼࣭ʹର͢ΔҙࣝΛߴΊ͍ͯͨͩ͘ • ࠙਌ձͰࢲ͕΅ͬͪʹͳΒͳ͍

Slide 8

Slide 8 text

ձ৔ͷΈͳ͞·ʹ࣭໰Ͱ͢

Slide 9

Slide 9 text

ීஈςετΛ͍ͯ͠ͳ͍ํ

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

ීஈςετΛ͍ͯ͠Δํ

Slide 12

Slide 12 text

͋ͳͨͷ΍͍ͬͯΔ͜ͱ͸
 ຊ౰ʹςετͳͷͰ͠ΐ͏͔ʁ

Slide 13

Slide 13 text

ςετͱ͸

Slide 14

Slide 14 text

ςετ (Testing) શͯͷϥΠϑαΠΫϧΛ௨࣮ͯ͡ࢪ͢Δ੩తɺಈ తͳϓϩηεʹ͓͍ͯɺ੒Ռ෺͕ಛఆͷཁ݅Λຬ ଍͢Δ͔Λ൑ఆ͠ɺ໨తʹ߹க͢Δ͜ͱΛ࣮ূ ͠ɺܽؕΛݟ͚ͭΔͨΊɺιϑτ΢ΣΞϓϩμΫ τ΍ؔ࿈੒Ռ෺ʹର͠ɺܭըɺ४උɺධՁΛ͢Δ ͜ͱɻ ——ʰISTQBιϑτ΢ΣΞςετඪ४༻ޠू (೔ຊޠ൛)ʱΑΓ

Slide 15

Slide 15 text

ͪΌΜͱ໨త͕Ռ͍ͨͤͯΔ͔ʁ • ςετίʔυΛॻ͍͔ͨΒͱ͍ͬͯ 
 ඞͣ͠΋ͦΕ͕ςετʹͳΔΘ͚Ͱ͸ͳ͍ • ը໘Λૢ࡞ͯ͠ಈ࡞Λ֬ೝ͔ͨ͠Βͱ͍ͬͯ 
 ඞͣ͠΋ͦΕ͕ςετʹͳΔΘ͚Ͱ͸ͳ͍

Slide 16

Slide 16 text

ςετϨϕϧ

Slide 17

Slide 17 text

ςετϨϕϧ (Test level) ܥ౷తʹ·ͱΊɺ؅ཧ͍ͯ͘͠ςετͷ׆ಈͷ άϧʔϓɻ֤ςετϨϕϧ͸ϓϩδΣΫτͷಛఆ ͷ੹຿ͱରԠ෇͚͕Ͱ͖ΔɻςετϨϕϧͷྫ ʹ͸ɺίϯϙʔωϯτςετɺ౷߹ςετɺγ εςϜςετɺड͚ೖΕςετ͕͋Δɻ ——ʰISTQBιϑτ΢ΣΞςετඪ४༻ޠू (೔ຊޠ൛)ʱΑΓ

Slide 18

Slide 18 text

VࣈϞσϧ

Slide 19

Slide 19 text

ίϯϙʔωϯτςετ (Component testing) • ݸʑͷιϑτ΢ΣΞίϯϙʔωϯτͷςετɻ 
 (ISTQB༻ޠू) • Ϣχοτςετ / ୯ମςετͱ 
 ݺ͹ΕΔ͜ͱ͕ଟ͍ • ίʔυͷ։ൃ୲౰ऀ͕ߦ͏͜ͱ͕Ұൠత

Slide 20

Slide 20 text

౷߹ςετ (Integration testing) • ౷߹ͨ͠ίϯϙʔωϯτ΍γεςϜͷ 
 ΠϯλʔϑΣʔε΍૬ޓ࡞༻ͷܽؕΛ 
 ఠग़͢ΔͨΊͷςετɻ (ISTQB༻ޠू) • ݸʑͷίϯϙʔωϯτͷػೳͰ͸ͳ͘ 
 ίϯϙʔωϯτؒͷίϛϡχέʔγϣϯʹ 
 য఺Λ౰ͯΔඞཁ͕͋Δ

Slide 21

Slide 21 text

γεςϜςετ (System testing) • ౷߹͞ΕͨγεςϜ͕ɺಛఆͷཁ݅Λ 
 ຬͨ͢͜ͱΛ࣮ূ͢ΔͨΊͷςετͷ 
 ϓϩηεɻ (ISTQB༻ޠू) • ΤϯυπʔΤϯυͷશମͷৼΔ෣͍Λ֬ೝ͢Δ • ػೳͱඇػೳͷ྆ํΛ֬ೝ͢Δ

Slide 22

Slide 22 text

ड͚ೖΕςετ (Acceptance testing) • γεςϜ͕ɺϢʔβͷχʔζɺཁ݅ɺ 
 ϏδωεɾϓϩηεΛຬ଍͢Δ͔ΛνΣοΫ 
 ͢ΔͨΊͷެࣜͳςετɻ (ISTQB༻ޠू) • ϢʔβʔʹΑͬͯߦΘΕΔ͜ͱ͕ଟ͍ • ຊ൪؀ڥ·ͨ͸ͦΕʹ͍ۙ؀ڥͰߦ͏

Slide 23

Slide 23 text

ΞδϟΠϧ։ൃʹ
 ͜ͷϞσϧ͸౰ͯ͸·Βͳ͍ͷͰ͸

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

ΞδϟΠϧͩͬͯมΘΒͳ͍ • ܭըΑΓมԽ΁ͷదԠʹॏ͖Λஔ͖ 
 υΩϡϝϯτΑΓಈ͘ίʔυΛॏࢹ͢Δ͕ 
 ઃܭΛ͠ͳ͍։ൃख๏Ͱ͸ͳ͍ • ҰճͷΠςϨʔγϣϯͷதͰ͸ 
 VࣈϞσϧʹ͍ۙܗ͕Ͱ͖͕͋Δ͸ͣ

Slide 26

Slide 26 text

ಈతςετ / ੩తςετ

Slide 27

Slide 27 text

ಈతςετ (Dynamic testing) ίϯϙʔωϯτ΍γεςϜͷιϑτ΢ΣΞΛ࣮ ߦͤͯ֬͞ೝ͢Δςετɻ ——ʰISTQBιϑτ΢ΣΞςετඪ४༻ޠू (೔ຊޠ൛)ʱΑΓ

Slide 28

Slide 28 text

੩తςετ (Static testing) ιϑτ΢ΣΞ։ൃͷ੒Ռ෺ (ཁ݅ɺઃܭɺຢ͸ɺ ίʔυͳͲ) ͷ࣮ߦΛͤͣʹ࣮ࢪ͢Δ੒Ռ෺ͷς ετɻͨͱ͑͹ɺϨϏϡʔɺ੩తղੳͳͲɻ ——ʰISTQBιϑτ΢ΣΞςετඪ४༻ޠू (೔ຊޠ൛)ʱΑΓ

Slide 29

Slide 29 text

੩తςετͷྫ • ੩తղੳπʔϧΛར༻ͯ͠ 
 ιʔείʔυΛධՁ͢Δ • ઃܭॻΛ࡞੒ऀͱผͷਓ͕ؒϨϏϡʔ͠ 
 ޡΓͷࢦఠɺվળͷఏҊΛߦ͏ • ιʔείʔυΛ࡞੒ऀͱผͷਓ͕ؒϨϏϡʔ͠ 
 ޡΓͷࢦఠɺվળͷఏҊΛߦ͏

Slide 30

Slide 30 text

੩తςετͷಛ௃ • ϓϩάϥϜΛಈ͔͢ඞཁ͕ͳ͍ͨΊ 
 ૣ͍ஈ֊Ͱߦ͏͜ͱ͕Ͱ͖Δ • อकੑʹؔ͢Δܽؕ (Մಡੑɺ࠶ར༻ੑ౳) ͷ 
 ݕग़͕Ͱ͖Δ • ܽؕʹΑͬͯҾ͖ى͜͞ΕͨނোͰ͸ͳ͘ 
 ܽؕͦͷ΋ͷΛݕग़͢Δ

Slide 31

Slide 31 text

ͱ͜ΖͰ͓ؾ͖ͮʹͳΓ·͔ͨ͠ʁ

Slide 32

Slide 32 text

PyCon miniͳͷʹPython͕ ग़͖͍ͯͯͳ͍ͷͰ͸

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

ͪΌΜͱ࣮૷͢Δ

Slide 35

Slide 35 text

ςελϒϧͳ࣮૷Λ৺͕͚Δ • ςετΛҙ࣮ࣝͯ͠૷͢Δ • ଞͷηΦϦʔͱ૬൓͢Δ͜ͱ΋͋Δ • ઃܭ͕৑௕ʹͳΔՄೳੑ͕͋Δ • PythonicͰͳ͍࣮૷ʹͳΔՄೳੑ͕͋Δ

Slide 36

Slide 36 text

ঢ়گʹΑͬͯมԽ͢Δ஋͸
 ֎෦͔Βड͚औΔ

Slide 37

Slide 37 text

վળલ import datetime # 結果が実行タイミングに依存する def is_saturday(): today = datetime.date.today() return today.weekday() == 5 if is_saturday(): print('Hello, PyCon mini Hiroshima!')

Slide 38

Slide 38 text

վળޙ import datetime # 同じ引数を渡せば同じ結果が返る def is_saturday(target): return target.weekday() == 5 if is_saturday(datetime.date.today()): print('Hello, PyCon mini Hiroshima!')

Slide 39

Slide 39 text

ґଘੑΛ֎෦͔Β஫ೖ͢Δ

Slide 40

Slide 40 text

վળલ class Weather: def __init__(self): self._api = WeatherApi() # テストを実施するたびに # APIへのアクセスが発生する def get_celsius(self): return self._api.get_celsius()

Slide 41

Slide 41 text

վળޙ class Weather: def __init__(self, api): self._api = api # テストを実施するたびに # 引数で渡されたオブジェクトへの # アクセスが発生する def get_celsius(self): return self._api.get_celsius()

Slide 42

Slide 42 text

ελϒ / ϞοΫ͕ར༻Մೳʹ import unittest class DummyWeatherApi(WeatherApi): def get_celsius(self): return 33.4 class SampleTest(unittest.TestCase): def test_sample(self): weather = Weather(DummyWeatherApi()) # get_celsiusに対するテストを実施

Slide 43

Slide 43 text

ͪΌΜͱςετ͢Δ

Slide 44

Slide 44 text

ԿΛ୲อ͍ͨ͠ͷ͔໌֬ʹ͢Δ • Must / Want / NeverʹԊͬͨ֬ೝΛ͢Δ • MustɿͰ͖ͳ͚Ε͹͍͚ͳ͍͜ͱ • WantɿͰ͖͍ͯΔͱخ͍͜͠ͱ • Neverɿىͬͯ͜͸͍͚ͳ͍͜ͱ

Slide 45

Slide 45 text

ڥք஋Λҙࣝͯ͠ςετ͢Δ • ೖྗ஋ͷڥքͷલޙͷ஋Ͱςετ͢Δ • ίϯϙʔωϯτςετͷجຊͱͳΔٕ๏ • ࣗવͱΧόϨοδ্͕͕Δ͸ͣ

Slide 46

Slide 46 text

ϒϥοΫϘοΫεςετ΋ඞཁ • ౷߹ςετҎ߱ͷςετͰ͸ 
 ϒϥοΫϘοΫεςετ͕த৺ͱͳΔ • ςετର৅ͷೖྗͱग़ྗʹண໨͠ 
 ಺෦ߏ଄ͷৄࡉ͸ҙࣝ͠ͳ͍

Slide 47

Slide 47 text

ϋοϐʔύεΛҙࣝ͢Δ • ϋοϐʔύεͷςετ͚ͩͰ͸ࠔΔ͕ 
 γεςϜͷྲྀΕΛ௥͏ʹ͸༗༻ • γεςϜςετͷϋοϐʔύε͸ 
 యܕతͳϢʔεέʔεʹ΋ͳΔ

Slide 48

Slide 48 text

؍఺࿙ΕΛ๷͙ͨΊʹ • ͋ͳͨͷίʔυ͕ɺࣗ෼ͷݴ༿Λ࿩͞ͳ͍ਓʹ ಡ·Εͳ͍ͱ֬৴͍ͯ͠ͳ͚Ε͹ɺίϝϯτΛ ӳޠͰॻ͘Α͏ʹ͓ئ͍͠·͢ɻ (PEP 8ΑΓ) • ͋ͳͨͷςετίʔυ͕ɺӳޠͰࢥߟͰ͖Δਓ ʹ͔͠ಡ·Εͳ͍ͱ֬৴͍ͯ͠ͳ͚Ε͹ɺςε τϝιου໊Λ೔ຊޠͰॻ͘Α͏ʹ͓ئ͍͠· ͢ɻ (ॾઆ͋Γ·͢)

Slide 49

Slide 49 text

Python 2͸ؔ਺໊ʹ
 ASCII͔͠࢖͑ͳ͍ͷͰ͸

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

ࣗಈςετ

Slide 52

Slide 52 text

ࣗಈςετʹ͍ͭͯ • աڈͷPyCon JPͰ 
 ૉ੖Β͍͠ൃද͕ͨ͘͞Μ͋Γ·͢ • https://www.youtube.com/user/PyConJP/ search?query=ςετ

Slide 53

Slide 53 text

ςετϐϥϛου

Slide 54

Slide 54 text

ιϑτ΢ΣΞςετͷ7ݪଇ

Slide 55

Slide 55 text

1. ςετ͸͕ܽؕ͋Δ͜ͱ͸ࣔͤΔ͕
 ͕ܽؕͳ͍͜ͱ͸ࣔͤͳ͍ • ιϑτ΢ΣΞʹނো͕ݟ͔ͭͬͨ৔߹ • ͦͷιϑτ΢ΣΞʹ͸͕ܽؕ͋Δ • ιϑτ΢ΣΞʹނো͕ݟ͔ͭΒͳ͔ͬͨ৔߹ • ͦͷιϑτ΢ΣΞʹ͕ܽؕͳ͍ͱ͸ݶΒͳ͍ • ࣮ࢪͨ͠ςετͰ͸ͨ·ͨ· 
 ܽؕΛݟ͚ͭΒΕͳ͔͚͔ͬͨͩ΋͠Εͳ͍

Slide 56

Slide 56 text

2. શ਺ςετ͸ෆՄೳ • ͢΂ͯͷೖྗͱ͢΂ͯͷ৚݅ͷ૊Έ߹Θͤ͸ 
 ແ਺ʹଘࡏ͢Δ • ༗ݶͷ࣌ؒͰ͢΂ͯͷύλʔϯΛ 
 ςετ͢Δ͜ͱ͸ෆՄೳ • ςετൣғΛॏཁͳ৔ॴʹߜΔ • ςετʹ༏ઌॱҐΛ͚ͭΔ

Slide 57

Slide 57 text

3. ૣظςετͰ࣌ؒͱίετΛઅ໿ • ܽؕΛݟ͚ͭΔͷ͕஗͘ͳΔ΄Ͳ 
 मਖ਼ͷίετ͕େ͖͘ͳΔ • ݪҼͷಛఆʹ͕͔͔࣌ؒΔ • ผͷػೳ͔Βࢀর͞Ε͍ͯͯमਖ਼ͮ͠Β͍ • ܽؕΛૣ͘ݟ͚ͭΔͨΊ 
 ։ൃαΠΫϧͷૣ͍࣌ظʹςετΛߦ͏

Slide 58

Slide 58 text

4. ܽؕͷภࡏ • ιϑτ΢ΣΞͷ͢΂ͯͷػೳ͕ 
 ಉ͡Α͏ʹ࡞ΒΕ͍ͯΔΘ͚Ͱ͸ͳ͍ • ઃܭ΍࣮૷ͷ೉қ౓͕ҧ͏ • ࿈ܞ͕ඞཁͳ֎෦ͱͷΠϯλʔϑΣΠε͕ҧ͏ • ܽؕ͸ۉҰʹ෼෍ͤͣʹಛఆͷػೳʹूத͠΍͍͢ • ύϨʔτͷ๏ଇ

Slide 59

Slide 59 text

5. ࡴ஬ࡎͷύϥυοΫεʹ͝༻৺ • ಉ͡ιϑτ΢ΣΞʹରͯ͠ಉ͡ςετΛ 
 ܁Γฦ͍ͯ͠Δͱ͍ͣΕܽؕΛൃݟͰ͖ͳ͘ͳΔ • ఆظతʹςετͷมߋ΍௥ՃΛߦ͏ • ͨͩ͠ϦάϨογϣϯςετͰ͸ 
 ಉ͡ςετΛ܁Γฦ͢͜ͱ͕༗༻

Slide 60

Slide 60 text

6. ςετ͸ঢ়گ࣍ୈ • ιϑτ΢ΣΞͷੑ࣭ʹΑͬͯ 
 ॏ఺తʹςετ͢Δ಺༰͕มΘͬͯ͘Δ • μ΢ϯͯ͠͸ࠔΔγεςϜͳͷͰ 
 ෛՙςετΛॏ఺తʹߦ͏ • ͓ۚΛѻ͏γεςϜͳͷͰ 
 ηΩϡϦςΟपΓΛॏ఺తʹςετ͢Δ • ͦͷػೳ͕ଘࡏ͠ͳ͍͜ͱ͕Ϗδωε্ͷϦεΫͳͷͰ 
 ςετͷ࣌ؒΛ୹Ίʹͯ͠ϦϦʔεͯ͠͠·͏

Slide 61

Slide 61 text

7. ʮόάθϩʯͷམͱ݀͠ • పఈతʹςετΛ࣮ࢪͯ͠ 
 ͕ܽؕݟ͔ͭΒͳ͘ͳͬͯ΋ 
 ͦΕͰ100఺ͷιϑτ΢ΣΞʹͳΔΘ͚Ͱ͸ͳ͍ • ࢖͍ʹ͍͘γεςϜ • ϢʔβʔͷχʔζΛຬͨ͞ͳ͍γεςϜ

Slide 62

Slide 62 text

͞Βʹਂֶ͘ͿͨΊʹ

Slide 63

Slide 63 text

ςελʔͪΌΜ ৽ਓ͞Μ͔ΒΘ͔Δ 
 ιϑτ΢ΣΞςετղઆϚϯΨ ιϑτ΢ΣΞςετͷجૅΛ 
 ອըͰ෼͔Γ΍͘͢ղઆ Webອը / ಉਓࢽ / Kindle

Slide 64

Slide 64 text

ॳΊͯͷࣗಈςετ ࣗಈςετͷߟ͑ํͱϑϨʔϜϫʔΫΛ 
 1͔Βղઆʂ (ॻ੶ଳΑΓ) WebγεςϜͷࣗಈςετΛ୊ࡐʹ 
 ߟ͑ํ΍ϑϨʔϜϫʔΫʹ͍ͭͯղઆ Jonathan Rasmusson ஶ / ۄ઒ ߛࢠ ༁ 
 (ΦϥΠϦʔδϟύϯ)

Slide 65

Slide 65 text

ϚΠϯυϚοϓ͔Β࢝ΊΔιϑτ΢ΣΞςετ ؍఺Λ૑଄͠ɺ޿͛ɺਂΊΔ (ॻ੶ଳΑΓ) ϚΠϯυϚοϓΛ࢖༻ͨ͠ 
 ςετͷܭըɺઃܭɺใࠂͳͲͷख๏Λ 
 ࣮ྫͱͱ΋ʹ෼͔Γ΍͘͢ղઆ ஑ా ڿ, ླ໦ ࡾل෉ ஶ (ٕज़ධ࿦ࣾ)

Slide 66

Slide 66 text

ςετۦಈPython pytestΛ࢖ͬͯPythonͰ 
 ςετۦಈ։ൃ͢ΔͨΊͷશ஌ࣝ (දࢴΑΓ) pytestΛར༻ͨ͠ςετͷॻ͖ํ΍ 
 ςετۦಈ։ൃͷਐΊํΛղઆ Brian Okken ஶ / ҆Ҫ ྗ ؂म 
 גࣜձࣾΫΠʔϓ ؂༁ (ᠳӭࣾ)

Slide 67

Slide 67 text

·ͱΊ

Slide 68

Slide 68 text

·ͱΊ • ίϯϙʔωϯτςετ͚͕ͩςετͰ͸ͳ͍ • ඼࣭ͷͨΊʹҙࣝ͢Δͱ͜Ζ͸ͨ͘͞Μ͋Δ • ౰ͨΓલͷ͜ͱΛ౰ͨΓલʹ΍Ζ͏ • ςετ͸࣮૷ͷޙ޻ఔͰ͸ͳ͍

Slide 69

Slide 69 text

ςετʹ͍ͭͯཧղͰ͖·͔ͨ͠ʁ

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠