͜ͷΑ͏ͳΈ͋Γ·ͤΜ͔ʁ w ΞϓϦέʔγϣϯΛ࣮ߦ͢Δڥߏஙͷେྔͷखॱ͕͋Δ w ྫ͑σʔλϕʔεͷΠϯετʔϧ w ΠϯετʔϧΛྃޙɺςετΛ࣮ߦ͢Δલʹඞཁͳ࡞ۀ w ςετσʔλͷσʔλͷೖ w ࠶ςετΛ࣮ߦ͢Δ߹ݩͷঢ়ଶʹ͢ w ࣗಈԽͦͷ͏͍ͪͨ͠Ͱ͢Ͷɾɾɾʢԕ͍ʣ
5FTUDPOUBJOFSTͰղܾͰ͖Δ͔ʁ w 5FTUDPOUBJOFST͜ΜͳΈΛղܾͯ͘͠Ε·͢ w ηοτΞοϓ͕ͭΒ͍ˠ+BWBͱ%PDLFS͕Πϯετʔϧ͞Ε͍ͯΕ 0,ʂ w खॱ͕ͭΒ͍ˠςετΫϥε͔Β༻͢ΔίϯςφΛىಈɺޙย͚ ෆཁ w ฒྻ࣮ߦ͕ͭΒ͍ˠςετΫϥε͝ͱʹσʔλϕʔεΛ༻ҙʂϙʔτ ؆୯ʹղܾ
5FTUDPOUBJOFSTͱʁ w +6OJUςετ͔Βܰྔ͔͍ࣺͭͯͷ%PDLFSίϯςφΛ࣮ߦ͢ΔϥΠϒϥϦ w ໊લؒҧ͍͑͢ͷͰҙ w 5FTU$POUBJOFSTʢ❌ɿ$͕େจࣈʣɺ5FTUDPOUBJOFSʢ❌ɿT͕ͳ͍ʣ w ͞·͟·ͳ044༻ϓϩμΫτͷςετͰར༻͞Ε͍ͯ·͢ w σʔλϕʔεΛར༻ͨ݁͠߹ςετʹ࠷ద w ଞʹ4FMFOJVNΛར༻ͨ͠6*ड͚ೖΕςετͰ͑·͢
࣮ߦ४උ ϓϩδΣΫτ࡞ w ࠓճ4QSJOHͷΞϓϦέʔγϣϯͷςετΛ࣮ߦ͢Δͷ͕ΰʔϧͳͷͰɺ 4QSJOH*OJUJBMJ[S͔ΒϓϩδΣΫτΛ࡞͠·͢ w 5FTUDPOUBJOFST4QSJOH*OJUJBMJ[Sʹొ͞Ε͍ͯ·͢ w σʔλϕʔε1PTUHSF42-Λબ͠·͢
ิ Ϟδϡʔϧʹ͍ͭͯ w ͜͜·ͰԿճ͔ग़͖͍ͯͯΔʮϞδϡʔϧʯʹ͍ͭͯ؆୯ʹઆ໌͠·͢ w 5FTUDPOUBJOFST(FOFSJD$POUBJOFSͱ͍͏ίϯςφΛ࣮ߦ͢ΔͨΊͷڞ௨ తͳػೳΛ࣋ͭΫϥεΛఏڙ͠·͢ w (FOFSJD$POUBJOFSΛܧঝͯ͠ಛఆͷίϯςφʹಛԽͨ͠ͷΛϞδϡʔϧͱ ݺΜͰ͍·͢
ίϯςφΛ࣮ߦ͠Α͏ ςετΫϥεͷΞϊςʔγϣϯͷ༩ w ίϯςφΛར༻͢ΔςετΫϥεʹ!5FTUDPOUBJOFSTΞϊςʔγϣϯΛ༩ ͠·͢ w 5FTUDPOUBJOFST͜ͷΞϊςʔγϣϯ͕͍ͭͨςετΛ࣮ߦ͢Δࡍʹίϯς φΛىಈͯ͘͠Ε·͢ @Testcontainers public class ContainerTest {
ίϯςφΛ࣮ߦ͠Α͏ ࣮ߦ͢Δίϯςφͷఆٛ w ࣮ߦ͢ΔίϯςφΛςετΫϥεͷTUBUJDϑΟʔϧυͰఆٛ͠·͢ w ΠϯελϯεॳظԽ࣌ʹίϯςφͷઃఆΛߦ͍·͢ w ࠓճσʔλϕʔε໊ͱ%%-Λఆٛͨ͠42-ϑΝΠϧΛಡΈࠐ·ͤ·͢ w ෳͷίϯςφΛಉ࣌ʹىಈ͍ͨ͠߹ϑΟʔϧυΛෳఆ͍ٛͯͩ͘͠͞ @Container private static PostgreSQLContainer postgresqlContainer = (PostgreSQLContainer)new PostgreSQLContainer("postgres:14.2") .withDatabaseName("todo") .withInitScript("todo.sql");
ίϯςφΛ࣮ߦ͠Α͏ ࣮ߦͯ͠ΈΑ͏ w ίϯςφͷఆ͕ٛऴΘͬͨΒςετΛ࣮ߦ͠·͢ w ςετΛ࣮ߦ͢Δͱ࠷ॳʹ5FTUDPOUJBOFST͕ఆٛ͞ΕͨίϯςφΛىಈ͠· ͢ w ͦͷޙɺςετϝιου͕ݺͼग़͞Ε·͢ w ͨͬͨ͜Ε͚ͩ४උͰςετͰར༻͢Δڥ͕ηοτΞοϓ͞Ε·ͨ͠ @Test void ίϯςφ͕ಈ͍͍ͯΔ͜ͱ() { assertTrue(postgresqlContainer.isRunning()); }
ίϯςφΛ࣮ߦ͠Α͏ ىಈͨ͠ίϯςφͷޙ࢝ w ىಈͨ͠ίϯςφΛఀࢭͨ͠Γআͨ͠Γ͢Δॲཧશ෦5FTUDPOUBJOFST͕ ͬͯ͘Ε·͢ w ίϯςφɾϘϦϡʔϜɾωοτϫʔΫͷશͯΛআͯ͘͠Ε·͢ w ޙ࢝5FTUDPOUBJOFSTʹͤͯςετΛॻ͘ͷʹઐ೦͠·͠ΐ͏ w ༨ஊͰ͕͢ίϯςφΛআͯ͘͠ΕΔͷϦϯΰ͕͖ͳࢮਆͰ͢ w ϦϡʔΫͱ͍͏໊ͷίϯςφ͕ཪͰ͓আͯ͠·͢
ίϯςφ࣮ߦͷิ खಈͰͷίϯςφىಈ w ΞϊςʔγϣϯΛར༻͠ͳ͍߹ɺOFXͨ͠ίϯςφΠϯελϯεͷTUBSUϝ ιουΛݺͼग़͢͜ͱͰίϯςφΛىಈ͢Δ͜ͱ͕Ͱ͖·͢ w ͜ͷํ๏Ͱىಈͨ͠߹Ͱίϯςφͷޙ࢝5FTUDPOUBJOFST͕ߦͬͯ͘ Ε·͢ // ࣮ߦ͢Δίϯςφͷఆٛ
PostgreSQLContainer postgresqlContainer = (PostgreSQLContainer) new PostgreSQLContainer("postgres:14.2") .withDatabaseName("todo") .withInitScript("todo.sql"); // ىಈ
ςετ͢ΔΞϓϦέʔγϣϯ w ςετରͷΞϓϦέʔγϣϯͱͯ͠ɺ؆୯ͳ5PEPͷΞϓϦΛར༻͠·͢ w ͜ͷΞϓϦͷ4FSWJDFΫϥεʹରͯ͠ɺ4QSJOH#PPU5FTUΛͬͨ݁߹ςετ Λ࣮ߦ͠·͢ @Transactional Todo addTodo(String task) { return repository.save(new Todo(null,task,"Waiting")); }
4QSJOH#PPU5FTU ςετ࣮ w 5FTUDPOUBJOFSTΛઃఆͨ͠ςετΫϥεʹҎԼͷͭΛՃ͠·͢ w 4QSJOH#PPU5FTUΞϊςʔγϣϯΛ༩͢Δ w 4QSJOHͷΞϓϦʹ5FTUDPOUBJOFSTͰىಈͨ͠σʔλϕʔεͷଓใΛ ࢦఆ͢Δ w ςετΫϥεʹςετ͢Δ4FSWJDFΫϥεΛ%*ͯ͠ςετϝιου͔Β࣮ߦ w ࠓ·Ͱͷ4QSJOH#PPUςετʹͰғͬͨॲཧΛՃ͢Δ͚ͩͰ͢
4QSJOH#PPU5FTUิ 5FTUDPOUBJOFSTͷόʔδϣϯ w 4QSJOH*OJUJBMJ[SͰ࡞ͨ͠ϓϩδΣΫτͷ5FTUDPOUBJOFSTͷόʔδϣϯ Ͱ͢ w Ҏ߱ͰՃ͞ΕͨϞδϡʔϧΛར༻͍ͨ͠߹ɺόʔδϣϯΛࢦఆ ͢Δඞཁ͕͋Γ·͢ʢࠓͷ࠷৽ʣ w Ճ͞ΕͨϞδϡʔϧ4FMFOJVNɺLTɺ)JWF.2ͷͭͰ͢
5FTUDPOUBJOFSTͷಋೖޮՌ w ࠓհͨ͠ൣғͰ5FTUDPOUBJOFSTͨ͘͞ΜͷࣄΛͯ͠·͢ w σʔλϕʔεͷΠϯετʔϧ͔Βআ·ͰΛςετΫϥεͱີʹ࿈ܞ w ʮ+BWBͱ%PDLFS͕͋ΕͲ͜ͷϚγϯͰޭ͢Δςετʯ͕࡞ΕΔؾ͕͠ ͖ͯ·ͤΜ͔ʁ w গͳ͘ͱΞϓϦςετʹؔͳ͍Ͱɺ։ൃऀͷखΛΘͤΔ࣌ؒ࿑ ྗ࣮֬ʹݮΓ·͢
·ͱΊ w қͱൺֱͯ͠5FTUDPOUBJOFSTͷՌׂͨ͢େ͖͍ͱࢥ͍·͢ w ݸਓతʹຯ͚ͩͲࣄΛ࣮֬ʹ͜ͳͯ͘͠ΕΔࣄਓελΠϧͳͱ͜Ζ͕ ͖Ͱ͢ w ϋϚΓϙΠϯτେମ࣮ߦ͢Δίϯςφͷ༷ɾɾɾ w ࠓճ4QSJOHͱͷΈ߹ΘͤΛհ͠·͕ͨ͠ɺผͷϑϨʔϜϫʔΫʢྫ͑ 2VBSLVTʣͱ࿈ܞ͢Δ͜ͱ͕Ͱ͖·͢ w ܁Γฦ͠ʹͳΓ·͕͢ɺςετڥͷ४උͱ͔໘ͳ͜ͱશ෦ 5FTUDPOUBJOFSTʹͤ·͠ΐ͏ʂ w ։ൃऀ͍͍ίʔυΛॻ͘͜ͱʹઐ೦͠Α͏ʂ
ࢀߟࢿྉ w IUUQTXXXUFTUDPOUBJOFSTPSH w ެࣜ)1υΩϡϝϯτ͕ॆ࣮ w (JUIVCͷFYBNQMFʹ༷ʑͳϞδϡʔϧͷαϯϓϧ͋Γ·͢ w IUUQTHJUIVCDPNXFOBTTQSJOHUDFYBNQMF w ຊηογϣϯͷεϥΠυʹషͬͨίʔυ w શͯΛհͰ͖·ͤΜͰͨ͠ͷͰɺ͠ΑΖ͚͠Εࢀর͍ͯͩ͘͠͞