çŸä»£ã®ãœãããŠã§ã¢éçºã§ã¯ã¹ããŒããšä¿ææ§ãéèŠãããŠãããããå¹ççãªãã¹ããéèŠã«ãªã£ãŠããŸããDORA ã®èª¿æ»ã«ãããšããšãªãŒã ããŒã ã¯é«ãããã©ãŒãã³ã¹ãšä¿¡é Œæ§ã®äž¡æ¹ã§ç¹æ ããããšãæããã«ãªã£ãŠããŸãããªãŒãã¿ã€ã ã 127åççž®ã幎é 182ä»¶ã®ãããã€ã¡ã³ãæ°ã倿Žå€±æçã 8åããããŠæãå°è±¡çãªããšã«ãã€ã³ã·ãã³ãåŸã®åŸ©æ§æéã 2å293ççž®ããããšãã§ããŸããç§å¯ã®ãœãŒã¹ã¯ã圌ãããå·Šã«ã·ãããããããšã§ããÂ
ã·ããã¬ããã¯ããã¹ããã»ãã¥ãªãã£ãªã©ã®çµ±åã¢ã¯ãã£ããã£ãéçºãµã€ã¯ã«ã®æ©ã段éã«ç§»è¡ããããŒã ãæ¬çªç°å¢ã«å°éããåã«åé¡ãæ€åºããŠä¿®æ£ã§ããããã«ãããã©ã¯ãã£ã¹ã§ããããŒã«ã«ãã¹ããšçµ±åãã¹ããæ©æã«çµã¿èŸŒãããšã§ãéçºè ã¯ã³ã¹ãã®ãããåŸææ®µéã®æ¬ é¥ãé²ããéçºãå éãããœãããŠã§ã¢ã®å質ãåäžãããããšãã§ããŸããÂ
ãã®èšäºã§ã¯ãçµ±åãã¹ããéçºã®å éšã«ãŒãã®æ©ã段éã§æ¬ é¥ãèŠã€ããã®ã«ã©ã®ããã«åœ¹ç«ã€ãã ãŸããTestcontainers ãåäœãã¹ããšåãããã軜éã§ç°¡åã«æããããããã«ããæ¹æ³ãåŠã³ãŸããæåŸã«ãçµ±åãã¹ãã®ã·ããã¬ãããéçºããã»ã¹ã®é床ãšå€æŽã®ãªãŒãã¿ã€ã ã«äžãã圱é¿ããDORA ã¡ããªã¯ã¹ã«åŸã£ãŠåæããŸããÂ
å®éã®äŸ: ãŠãŒã¶ãŒç»é²ã§ã®å€§æåãšå°æåã®åºå¥ã®ãã°
åŸæ¥ã®ã¯ãŒã¯ãããŒã§ã¯ãçµ±åãã¹ããš E ãã¹ã2E ãã¹ãã¯éçºãµã€ã¯ã«ã®å€åŽã®ã«ãŒãã§å®è¡ãããããšãå€ãããã°æ€åºã®é å»¶ãé«äŸ¡ãªä¿®æ£ã«ã€ãªãããŸããããšãã°ããŠãŒã¶ãŒãã¡ãŒã«ã¢ãã¬ã¹ãå ¥åãããŠãŒã¶ãŒç»é²ãµãŒãã¹ãæ§ç¯ããŠããå Žåã¯ãã¡ãŒã«ã倧æåãšå°æåãåºå¥ãããä¿åæã«éè€ããªãããã«ããå¿ èŠããããŸããÂ
倧æåãšå°æåã®åºå¥ãé©åã«åŠçããããããŒã¿ããŒã¹ã«ãã£ãŠç®¡çãããŠãããšæ³å®ãããŠããå Žåã倧æåãšå°æåã®ã¿ãç°ãªãéè€ã¡ãŒã«ã䜿çšããŠãŠãŒã¶ãŒãç»é²ã§ããã·ããªãªã®ãã¹ãã¯ãE ãã¹ã2E ãã¹ããŸãã¯æåãã§ãã¯äžã«ã®ã¿çºçããŸãããã®æ®µéã§ã¯ãSDLCã§ã¯é ãããã³ã¹ãã®ãããä¿®æ£ã«ã€ãªããå¯èœæ§ããããŸãã
ãã¹ããæ©æã«ç§»è¡ããéçºè ãããŒã¿ããŒã¹ãã¡ãã»ãŒãžãããŒã«ãŒãã¯ã©ãŠããšãã¥ã¬ãŒã¿ãŒããã®ä»ã®ãã€ã¯ããµãŒãã¹ãªã©ã®å®éã®ãµãŒãã¹ãããŒã«ã«ã§ã¹ãã³ã¢ããã§ããããã«ããããšã§ããã¹ãããã»ã¹ãå€§å¹ ã«é«éåãããŸããããã«ãããéçºè ã¯æ¬ é¥ãããæ©ãæ€åºããŠè§£æ±ºã§ããè²»çšã®ãããåŸæä¿®æ£ãé²ãããšãã§ããŸãã
ãã®ã·ããªãªäŸãšãããŸããŸãªã¿ã€ãã®ãã¹ãã§ãããã©ã®ããã«åŠçãããããæ·±ãæãäžããŠã¿ãŸãããã
ã·ããªãª
æ°ããéçºè ããŠãŒã¶ãŒç»é²ãµãŒãã¹ãå®è£ ããéçšç°å¢ãžã®ãããã€ãæºåããŠããŸãã
registerUser ã¡ãœããã®ã³ãŒãäŸ
async registerUser(email: string, username: string): Promise<User> {
const existingUser = await this.userRepository.findOne({
where: {
email: email
}
});
if (existingUser) {
throw new Error("Email already exists");
}
...
}
ãã°
registerUser ã¡ãœããã¯å€§æåãšå°æåã®åºå¥ãé©åã«åŠçãããæ¢å®ã§ã¯ããŒã¿ããŒã¹ãŸã㯠UI ãã¬ãŒã ã¯ãŒã¯ã«äŸåããŠå€§æåãšå°æåã®åºå¥ãåºå¥ããŸããããããã£ãŠãå®éã«ã¯ããŠãŒã¶ãŒã¯å€§æåãšå°æåã®äž¡æ¹(äŸ: user@example.com ãš USER@example.com)ã§éè€ããé»åã¡ãŒã«ãç»é²ã§ããŸãã
ã€ã³ãã¯ã
- èªèšŒã®åé¡ã¯ãé»åã¡ãŒã«ã®å€§æåãšå°æåã®äžäžèŽããã°ã€ã³å€±æãåŒãèµ·ããããã«çºçããŸãã
- ã»ãã¥ãªãã£ã®è匱æ§ã¯ããŠãŒã¶ãŒ ID ã®éè€ãåå ã§çºçããŸãã
- ããŒã¿ã®äžæŽåã¯ããŠãŒã¶ãŒID管çãè€éã«ããŸãã
ãã¹ãæ¹æ³ 1: åäœãã¹ããÂ
ãããã®ãã¹ãã§ã¯ã³ãŒãèªäœã®ã¿ãæ€èšŒããããããé»åã¡ãŒã«ã®å€§æåãšå°æåã®åºå¥ã®æ€èšŒã¯ãSQL ã¯ãšãªãå®è¡ãããããŒã¿ããŒã¹ã«äŸåããŸããåäœãã¹ãã¯å®éã®ããŒã¿ããŒã¹ã«å¯ŸããŠã¯å®è¡ãããªãããã倧æåãšå°æåã®åºå¥ãªã©ã®åé¡ããã£ããã§ããŸãããÂ
ãã¹ãæ¹æ³ 2:ãšã³ãããŒãšã³ãã®ãã¹ããŸãã¯æåãã§ãã¯ãÂ
ãããã®æ€èšŒã§ã¯ãã³ãŒããã¹ããŒãžã³ã°ç°å¢ã«ãããã€ãããåŸã«ã®ã¿åé¡ããã£ãããããŸããèªååã¯åœ¹ç«ã¡ãŸãããéçºãµã€ã¯ã«ã®åŸåã§åé¡ãæ€åºãããšãéçºè ãžã®ãã£ãŒãããã¯ãé ããä¿®æ£ã«æéãšã³ã¹ããããããŸãã
ãã¹ãæ¹æ³ 3: ã¢ãã¯ã䜿çšããŠããŠããã ãã¹ããšããŒã¿ããŒã¹ã®å¯Ÿè©±ãã·ãã¥ã¬ãŒãããŸããÂ
ããŸããããè¿ éã«å埩ã§ããã¢ãããŒãã® 1 ã€ã¯ãããŒã¿ããŒã¹ã¬ã€ã€ãŒãã¢ãã¯ãããšã©ãŒã§å¿çããã¢ãã¯ãªããžããªãå®çŸ©ããããšã§ããæ¬¡ã«ãéåžžã«é«éã«å®è¡ãããåäœãã¹ããèšè¿°ã§ããŸãã
test('should prevent registration with same email in different case', async () => {
const userService = new UserRegistrationService(new MockRepository());
await userService.registerUser({ email: 'user@example.com', password: 'password123' });
await expect(userService.registerUser({ email: 'USER@example.com', password: 'password123' }))
.rejects.toThrow('Email already exists');
});
äžèšã®äŸã§ã¯ãUser ãµãŒãã¹ã¯ãããŒã¿ããŒã¹ã®ã¡ã¢ãªå è¡šçŸ (ã€ãŸãããŠãŒã¶ãŒã®ããã) ãä¿æããã¢ãã¯ãªããžããªã䜿çšããŠäœæãããŸãããã®ã¢ãã¯ãªããžããªã¯ããŠãŒã¶ãŒã 2 åæž¡ãããã©ãããæ€åºãããããããŠãŒã¶ãŒåã倧æåãšå°æåãåºå¥ããªãããŒãšããŠäœ¿çšããäºæ³ããããšã©ãŒãè¿ããŸããÂ
ããã§ã¯ãæ€èšŒããžãã¯ãã¢ãã¯ã«ã³ãŒãã£ã³ã°ããUserãµãŒãã¹ãŸãã¯ããŒã¿ããŒã¹ãäœããã¹ãããè€è£œããå¿ èŠããããŸãããŠãŒã¶ãŒã®æ€èšŒã«å€æŽãå¿ èŠãªå Žå (äŸ:ç¹æ®æåãå«ãŸãªããããã¢ãã¯ã倿Žããå¿ èŠããããŸãããã以å€ã®å Žåããã¹ãã¯æ€èšŒã®å€ãç¶æ ã«å¯ŸããŠã¢ãµãŒãããŸããã¢ãã¯ã®äœ¿çšãã³ãŒãããŒã¹å šäœã«åæ£ããŠããå Žåããã®ã¡ã³ããã³ã¹ã¯éåžžã«å°é£ã«ãªãå¯èœæ§ããããŸãã
ãããé¿ããããã«ãäŸåããŠãããµãŒãã¹ã®å®éã®è¡šçŸã䜿çšããçµ±åãã¹ããæ€èšããŸããäžèšã®äŸã§ã¯ãããŒã¿ããŒã¹ãªããžããªã䜿çšãããšããã¹ã察象ã«å¯Ÿããä¿¡é Œæ§ãåäžãããããã¢ãã¯ãããã¯ããã«åªããŠããŸãã
ãã¹ãææ³ 4: Testcontainersã«ããã·ããã¬ããããŒã«ã«çµ±åãã¹ãÂ
ã¢ãã¯ã䜿çšããããã¹ããŒãžã³ã°ãçµ±åãã¹ãã E ãã¹ã2E ãã¹ããå®è¡ããã®ãåŸ ã£ãããã代ããã«ãåé¡ãæ©æã«æ€åºã§ããŸããããã¯ãéçºè ãå®éã®PostgreSQLããŒã¿ããŒã¹ã§ Testcontainers ã䜿çšããŠãéçºè ã®å éšã«ãŒãã§ãããžã§ã¯ãã®çµ±åãã¹ããããŒã«ã«ã«å®è¡ã§ããããã«ããããšã§å®çŸãããŸãã
å©ç¹
- æéã®ç¯çŽ:ãã¹ãã¯æ°ç§ã§å®è¡ããããã°ãæ©æã«çºèŠããŸãã
- ããçŸå®çãªãã¹ã: ã¢ãã¯ã®ä»£ããã«å®éã®ããŒã¿ããŒã¹ã䜿çšããŸãã
- æ¬çªç°å¢ã®æºåç¶æ³ã®ä¿¡é Œæ§: ããžãã¹ã¯ãªãã£ã«ã«ãªããžãã¯ãæåŸ ã©ããã«åäœããããšã確èªããŸãã
çµ±åãã¹ãã®äŸ
ãŸããTestcontainersã©ã€ãã©ãªã䜿çšããŠPostgreSQLã³ã³ãããèšå®ãããã®PostgreSQLã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ããããã®userRepositoryãäœæããŸãããã
let userService: UserRegistrationService;
beforeAll(async () => {
container = await new PostgreSqlContainer("postgres:16")
.start();
dataSource = new DataSource({
type: "postgres",
host: container.getHost(),
port: container.getMappedPort(5432),
username: container.getUsername(),
password: container.getPassword(),
database: container.getDatabase(),
entities: [User],
synchronize: true,
logging: true,
connectTimeoutMS: 5000
});
await dataSource.initialize();
const userRepository = dataSource.getRepository(User);
userService = new UserRegistrationService(userRepository);
}, 30000);
ããã§ãåæåãããuserServiceã䜿çšããŠãregisterUserã¡ãœããã䜿çšããŠãå®éã®PostgreSQLã€ã³ã¹ã¿ã³ã¹ã§ã®ãŠãŒã¶ãŒç»é²ããã¹ãã§ããŸãã
test('should prevent registration with same email in different case', async () => {
await userService.registerUser({ email: 'user@example.com', password: 'password123' });
await expect(userService.registerUser({ email: 'USER@example.com', password: 'password123' }))
.rejects.toThrow('Email already exists');
});
ãªããããæ©èœããã®ã
- Testcontainersãä»ããŠå®éã®PostgreSQLããŒã¿ããŒã¹ã䜿çš
- 倧æåãšå°æåãåºå¥ããªãé»åã¡ãŒã«ã®äžææ§ãæ€èšŒ
- ã¡ãŒã«ã®ä¿å圢åŒã確èªããŸã
Testcontainersãã©ã®ããã«åœ¹ç«ã€ã
Testcontainersã¢ãžã¥ãŒã«ã¯ ãæãäžè¬çãªãã¯ãããžãŒã®äºåèšå®ãããå®è£ ãæäŸããå ç¢ãªãã¹ãããããŸã§ä»¥äžã«ç°¡åã«èšè¿°ã§ããŸããã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹ãã¡ãã»ãŒãžãããŒã«ãŒãAWSãªã©ã®ã¯ã©ãŠããµãŒãã¹(LocalStackçµç±)ããŸãã¯ãã®ä»ã®ãã€ã¯ããµãŒãã¹ã«äŸåããŠãããã©ããã«ããããããTestcontainersã«ã¯ãã¹ãã¯ãŒã¯ãããŒãåçåããã¢ãžã¥ãŒã«ããããŸãã
Testcontainers ã䜿çšãããšããµãŒãã¹ã¬ãã«ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãã¢ãã¯ããŠã·ãã¥ã¬ãŒãããããã³ã³ãã©ã¯ããã¹ãã䜿çšããŠãµãŒãã¹ãä»ã®ãµãŒãã¹ãšã©ã®ããã«çžäºäœçšãããã確èªãããããããšãã§ããŸãããã®ã¢ãããŒããå®éã®äŸåé¢ä¿ã«å¯ŸããããŒã«ã«ãã¹ããšçµã¿åãããããšã§ãTestcontainersã¯ããŒã«ã«çµ±åãã¹ãã®å æ¬çãªãœãªã¥ãŒã·ã§ã³ãæäŸããã»ããã¢ãããšç®¡çãå°é£ã§ã³ã¹ãããããããšãå€ãå ±æçµ±åãã¹ãç°å¢ã®å¿ èŠæ§ãæé€ããŸããTestcontainers ãã¹ããå®è¡ããã«ã¯ãã³ã³ãããã¹ãã³ã¢ããããããã® Docker ã³ã³ããã¹ããå¿ èŠã§ããDocker Desktop ã¯ãããŒã«ã« ãã¹ãçšã® Testcontainers ãšã®ã·ãŒã ã¬ã¹ãªäºææ§ãä¿èšŒããŸããÂ
Testcontainers Cloud:ãã€ããã©ãŒãã³ã¹ããŒã ã®ããã®ã¹ã±ãŒã©ãã«ãªãã¹ã
Testcontainersã¯ãå®éã®äŸåé¢ä¿ãããŒã«ã«ã§äœ¿çšããŠçµ±åãã¹ããå¯èœã«ããåªãããœãªã¥ãŒã·ã§ã³ã§ãããã¹ããããã«äžæ©é²ããŠãããŒã éã§ã®Testcontainersã®äœ¿çšã®ã¹ã±ãŒãªã³ã°ããã¹ãã«äœ¿çšãããã€ã¡ãŒãžã®ç£èŠãCIã§ã®Testcontainersãã¹ãã®ã·ãŒã ã¬ã¹ãªå®è¡ãè¡ãããå Žåã¯ã Testcontainers Cloudã®äœ¿çšãæ€èšããå¿ èŠããããŸããããã¯ãå°çšã®ãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã管çãããªãŒããŒãããã®ãªãäžæçãªç°å¢ãæäŸããŸããTestcontainers CloudãããŒã«ã«ããã³CIã§äœ¿çšãããšãäžè²«ãããã¹ãçµæãä¿èšŒãããã³ãŒã倿Žã«å¯Ÿããä¿¡é Œæ§ãé«ãŸããŸããããã«ãTestcontainers Cloudã䜿çšãããšãè€æ°ã®ãã€ãã©ã€ã³éã§CIã®çµ±åãã¹ããã·ãŒã ã¬ã¹ã«å®è¡ã§ãããããé«å質ã®åºæºãå€§èŠæš¡ã«ç¶æããã®ã«åœ¹ç«ã¡ãŸããæåŸã«ãTestcontainers Cloudã¯ããå®å šã§ãã³ã³ããã®ã»ãã¥ãªãã£ã¡ã«ããºã ã«å¯ŸããŠããå³ããèŠä»¶ãæã€ããŒã ãäŒæ¥ã«æé©ã§ãã  Â
ã·ããã¬ãããã¹ãã®ããžãã¹ãžã®åœ±é¿ã®æž¬å®
ãããŸã§èŠãŠããããã«ãTestcontainersã䜿çšããã·ããã¬ãããã¹ãã¯ãæ¬ é¥æ€åºçãšæéãå€§å¹ ã«æ¹åããéçºè ã®ã³ã³ããã¹ãåãæ¿ããæžãããŸããäžèšã®äŸãåãäžããŠãããŸããŸãªæ¬çªç°å¢ã®ãããã€ã¯ãŒã¯ãããŒãšãåææ®µéã®ãã¹ããéçºè ã®çç£æ§ã«ã©ã®ããã«åœ±é¿ããããæ¯èŒããŠã¿ãŸããããÂ
åŸæ¥ã®ã¯ãŒã¯ãã㌠(å ±æçµ±åç°å¢)
ããã»ã¹ã®å èš³:
åŸæ¥ã®ã¯ãŒã¯ãããŒã§ã¯ããã£ãŒãã£ãŒã»ã³ãŒãã®èšè¿°ãããŒã«ã«ã§ã®ãŠãããã»ãã¹ãã®å®è¡ã倿Žã®ã³ããããããã³å€éšã«ãŒãã§ã®æ€èšŒãããŒã®ãã«ã»ãªã¯ãšã¹ãã®äœæãè¡ãããŠããŸãããå€åŽã®ã«ãŒãã§ãã°ãæ€åºãããå Žåãéçºè 㯠IDE ã«æ»ãããŠããã ãã¹ããããŒã«ã«ã§å®è¡ããããã»ã¹ãšãä¿®æ£ãæ€èšŒããããã®ä»ã®æé ãç¹°ãè¿ãå¿ èŠããããŸããÂ

å³ 1: åŸæ¥ã®å ±æçµ±åç°å¢ã®ã¯ãŒã¯ãããŒã¯ãåã¹ãããã«ããã£ãæéå¥ã«åé¡ãããŠããŸãã
倿Žã®ãªãŒãã¿ã€ã (LTC): ãã°ãæ€åºããŠä¿®æ£ããã«ã¯ãå°ãªããšã 1 æéãã 2 æéããããŸã (CI/CD ã®è² è·ãšç¢ºç«ããããã©ã¯ãã£ã¹ã«ãã£ãŠç°ãªããŸã)ãæè¯ã®ã·ããªãªã§ã¯ãã³ãŒãã®ã³ãããããéçšç°å¢ãžã®ãããã€ãŸã§çŽ 2 æéããããŸããææªã®ã·ããªãªã§ã¯ãè€æ°åã®ã€ãã¬ãŒã·ã§ã³ãå¿ èŠãªå Žåã¯ãæ°æéãŸãã¯æ°æ¥ãããå ŽåããããŸãã
ãããã€é »åºŠ (DF) ãžã®åœ±é¿: ãã€ãã©ã€ã³ã®é害ã®ä¿®æ£ã«ã¯çŽ 2 æéãããå Žåãããã1 æ¥ã®æéå¶çŽ (1 æ¥ã®8æéåŽåæé) ããããããçŸå®çã«ã¯ 1 æ¥ã« 3 åãã 4 åãããããã€ã§ããŸãããè€æ°ã®é害ãçºçãããšããããã€ã®é »åºŠãããã«äœäžããå¯èœæ§ããããŸãã
ãã®ä»ã®é¢é£è²»çš: ãã€ãã©ã€ã³ ã¯ãŒã«ãŒã®å®è¡æé (å) ãšå ±æçµ±åç°å¢ã®ã¡ã³ããã³ã¹ ã³ã¹ãã
éçºè ã³ã³ããã¹ãã®åãæ¿ã: ãã°æ€åºã¯ã³ãŒãã®ã³ãããããçŽ 30 ååŸã«è¡ããããããéçºè ã¯éäžåã倱ããŸããããã«ãããåžžã«ã³ã³ããã¹ãã®åãæ¿ãããããã°ããããŠåã³ã³ã³ããã¹ãã®åãæ¿ããè¡ãå¿ èŠããããããèªç¥è² è·ãå¢å ããŸãã
ã·ããã¬ããã¯ãŒã¯ãããŒ(Testcontainersã䜿çšããããŒã«ã«çµ±åãã¹ã)
ããã»ã¹ã®å èš³:
ã·ããã¬ããã®ã¯ãŒã¯ãããŒã¯ã¯ããã«åçŽã§ãã³ãŒãã®èšè¿°ãšåäœãã¹ãã®å®è¡ããå§ãŸããŸããéçºè ã¯ãå€åŽã®ã«ãŒãã§çµ±åãã¹ããå®è¡ãã代ããã«ãå åŽã®ã«ãŒãã§ããŒã«ã«ã«å®è¡ããŠãåé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãšä¿®æ£ãè¡ãããšãã§ããŸãã倿Žã¯ãæ¬¡ã®æé ãšå€åŽã®ã«ãŒãã«é²ãåã«å床確èªãããŸããÂ

å³ 2: Shift-Left ãš Testcontainers ã䜿çšããããŒã«ã«çµ±åãã¹ãã®ã¯ãŒã¯ãããŒããåã¹ãããã«ããã£ãæéå¥ã«åé¡ããã£ãŒãããã¯ã«ãŒãã¯ã¯ããã«é«éã«ãªããéçºè ã®æéãšããŠã³ã¹ããªãŒã ã®é çã®çš®ãç¯çŽã§ããŸãã
倿Žã®ãªãŒãã¿ã€ã (LTC): éçºè ã®å éšã«ãŒãã®ãã°ãæ€åºããŠä¿®æ£ããã®ã« 20 åãããããŸããããããã£ãŠãããŒã«ã«çµ±åãã¹ãã§ã¯ãå ±æçµ±åç°å¢ã§ã®ãã¹ããããå°ãªããšã 65% é«éã«é害ãç¹å®ã§ããŸãã Â
ãããã€é »åºŠ (DF) ãžã®åœ±é¿: æ¬ é¥ãç¹å®ããã20å以å ã«ããŒã«ã«ã§ä¿®æ£ãããããããã€ãã©ã€ã³ã¯æ¬çªç°å¢ãŸã§å®è¡ãããæ¯æ¥10ã€ä»¥äžã®ãããã€ãå¯èœã«ãªããŸãã
远å ã®é¢é£ã³ã¹ã: Testcontainers Cloud ã®5 åãæ¶è²»ãããŸãã Â
éçºè ã³ã³ããã¹ãã®åãæ¿ã: ããŒã«ã«ã§å®è¡ãããŠãããã¹ãã¯ãã³ãŒãã®å€æŽã«é¢ãã峿ã®ãã£ãŒãããã¯ãæäŸããéçºè ã¯IDEå ãšå éšã«ãŒãã«éäžã§ãããããéçºè ã¯ã³ã³ããã¹ããåãæ¿ããå¿ èŠã¯ãããŸããã
éèŠãªãã€ã³ã
| åŸæ¥ã®ã¯ãŒã¯ãããŒ(å ±æçµ±åç°å¢) | ã·ããã¬ããã¯ãŒã¯ãããŒ(Testcontainersã䜿çšããããŒã«ã«çµ±åãã¹ã) | æ¹åç¹ãšãã®ä»ã®åèè³æ | |
| 倿Žã®ãªãŒãã¿ã€ã ã®ççž®(LTC | ã³ãŒãã®å€æŽãæ°æéãŸãã¯æ°æ¥ã§æ€èšŒãããŸããéçºè ã¯ãå ±æã® CI/CD ç°å¢ãåŸ ã¡ãŸãã | ã³ãŒãã®å€æŽãæ°åã§æ€èšŒããŸãããã¹ãã¯å³æãã€ããŒã«ã«ã«è¡ãããŸãã | >65% 倿Žã®ãªãŒãã¿ã€ã ã®ççž® (LTC) â Microsoft ã¯ãã·ããã¬ããææ³ãæ¡çšããããšã§ããªãŒãã¿ã€ã ãæ°æ¥ããæ°æéã«ççž®ããŸããã |
| ããé«ããããã€ã¡ã³ãé »åºŠ(DF) | ãããã€ã¯ãæ€èšŒãµã€ã¯ã«ãé ããããæ¯æ¥ãæ¯é±ããŸãã¯æ¯æè¡ãããŸãã | ç¶ç¶çãªãã¹ãã«ããã1 æ¥ã«è€æ°ã®ãããã€ãå¯èœã«ãªããŸãã | 2x ãããã€é »åºŠã®å¢å â DORA ã¬ããŒã2024ãã·ããã¬ããã®ãã©ã¯ãã£ã¹ããããã€é »åºŠã® 2 å以äžã§ããããšã瀺ããŠããŸãããšãªãŒãããŒã 㯠182åé »ç¹ã«ãããã€ããŸãã |
| 倿Žå€±æç(CFR)ã®äœäž | æ¬çªç°å¢ã«æŒãããã°ã¯ãã³ã¹ãã®ãããããŒã«ããã¯ãç·æ¥ä¿®æ£ã«ã€ãªããå¯èœæ§ããããŸãã | CI/CD ã§ããå€ãã®ãã°ãæ©æã«æ€åºãããéçšãšã©ãŒãæžå°ããŸãã | 倿Žå€±æçã®äœäž â IBMã®ã·ã¹ãã ç§åŠç ç©¶æã¯ ãçç£ã§èŠã€ãã£ãæ¬ é¥ã¯ãæ©æã«çºèŠãããæ¬ é¥ãããä¿®æ£ã³ã¹ãã 15åãããããšæšå®ããŠããŸãã |
| å¹³ååŸ©æ§æé(MTTR)ã®ççž® | ä¿®æ£ã«ã¯ãå ±æç°å¢ã§ã®è€éãªãããã°ã®ããã«ãæ°æéãæ°æ¥ããŸãã¯æ°é±éããããŸãã | ããŒã«ã«ãã¹ãã«ããè¿ éãªãã°è§£æ±ºãä¿®æ£ã¯æ°åã§ç¢ºèªãããŸããã | MTTRã®é«éåâDORA ã®ãšãªãŒã ããã©ãŒããŒã¯ ãäœããã©ãŒããŒãæ°é±éãã 1 ãæãããã®ã«å¯Ÿãã1 æéæªæºã§ãµãŒãã¹ãåéããŸãã |
| ã³ã¹ãåæž | é«äŸ¡ãªå ±æç°å¢ãé ããã€ãã©ã€ã³ã®å®è¡ãé«ãã¡ã³ããã³ã¹ã³ã¹ãã | ã³ã¹ãã®ããããã¹ãç°å¢ãæé€ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®è²»çšãåæžããŸãã | å€§å¹ ãªã³ã¹ãåæž â ThoughtWorks Technology Radar㯠ãå ±æçµ±åç°å¢ãè匱ã§é«äŸ¡ã§ããããšã匷調ããŠããŸãã |
衚 1: Testcontainers ã䜿çšããããŒã«ã« ãã¹ãã§ã·ãã ã¬ãã ã¯ãŒã¯ãããŒã䜿çšããäž»èŠãªã¡ããªãã¯ã®æ¹åã®æŠèŠ
çµè«
ã·ããã¬ãããã¹ãã¯ãåé¡ãæ©æã«çºèŠãããããã°ã®åŽåãæžãããã·ã¹ãã ã®å®å®æ§ãé«ããéçºè ã®çç£æ§ãå šäœçã«åäžãããããšã§ããœãããŠã§ã¢ã®å質ãåäžãããŸãããããŸã§èŠãŠããããã«ãå ±æçµ±åç°å¢ã«äŸåããåŸæ¥ã®ã¯ãŒã¯ãããŒã¯ãéå¹çæ§ãããããã倿Žã®ãªãŒãã¿ã€ã ããããã€ã®é å»¶ãé »ç¹ãªã³ã³ããã¹ãåãæ¿ãã«ããèªç¥è² è·ã®å¢å ãåŒãèµ·ãããŸããå¯Ÿç §çã«ãããŒã«ã«çµ±åãã¹ãã« Testcontainers ãå°å ¥ããããšã§ãéçºè ã¯æ¬¡ã®ããšãå®çŸã§ããŸãã
- ãã£ãŒãããã¯ã«ãŒãã®è¿ é å â ãã°ã¯æ°å以å ã«ç¹å®ããã³è§£æ±ºããããããé å»¶ãé²ãããšãã§ããŸãã
- ããä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ã®åäœ â çŸå®çãªç°å¢ã§ã®ãã¹ãã«ããããªãªãŒã¹ã®ä¿¡é Œæ§ã確ä¿ã§ããŸãã
- é«äŸ¡ãªã¹ããŒãžã³ã°ç°å¢ãžã®äŸåãæžãã â å ±æã€ã³ãã©ã¹ãã©ã¯ãã£ãæå°éã«æããããšã§ãã³ã¹ããåæžããCI/CDããã»ã¹ãå¹çåããŸãã
- éçºè ã®ãããŒç¶æ ã®æ¹å â ããŒã«ã«ã®ãã¹ãã·ããªãªãç°¡åã«èšå®ãããããã°ã®ããã«è¿ éã«åå®è¡ããããšã§ãéçºè ã¯ã€ãããŒã·ã§ã³ã«éäžã§ããŸãã
Testcontainersã¯ãããŒã«ã«ã§ãã¹ãããé«äŸ¡ãªåé¡ãæ©æã«çºèŠããããã®ç°¡åã§å¹ççãªæ¹æ³ãæäŸããŸããããŒã éã§æ¡åŒµããããã«ãéçºè 㯠Docker Desktop ãš Testcontainers Cloud ã䜿çšããŠãå°çšã®ãã¹ã ã€ã³ãã©ã¹ãã©ã¯ãã£ãç¶æããè€éããªãã«ãããŒã«ã«ãCIããŸãã¯äžæçãªç°å¢ã§åäœãã¹ããšçµ±åãã¹ããå®è¡ããããšãæ€èšã§ããŸããTestcontainersãšTestcontainers Cloudã®è©³çްã«ã€ããŠã¯ãããã¥ã¡ã³ããã芧ãã ãããÂ
åèæç®
- Testcontainers Cloudã¢ã«ãŠã³ãã«ãµã€ã³ã¢ããããŸãã
- ãTestcontainers Cloud by Docker ããã¹ã¿ãŒãã: ã³ã³ããã«ããçµ±åãã¹ãã®å¹çåãã®ã¬ã€ãã«åŸã£ãŠãã ããã
- Testcontainers Slackã§æ¥ç¶ããŸãã
- Testcontainersã¬ã€ãããå§ããŸãããã
- Testcontainers ã®ãã¹ã ãã©ã¯ãã£ã¹ã«ã€ããŠèª¬æããŸãã
- Testcontainersã䜿çšããSpring Bootã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããšéçºã«ã€ããŠåŠã¶
- Docker Newsletter ã賌èªããŠãã ããã
- 質åããããŸãã? Docker ã³ãã¥ããã£ããæäŒãããŸãã
- ããã«ãŒã¯åããŠã§ãã? å§ããŸãããã