Phpunit: ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋Š” setupBeforeClass ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 02์›” 21์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sebastianbergmann/phpunit

๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋Š” ์ •์  setupBeforeClass ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€:

  • ์–ด๋Œ‘ํ„ฐ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์–ด๋Œ‘ํ„ฐ๋Š” ์ผ๋ถ€ ํ™˜๊ฒฝ(์˜ˆ: Linux ๋Œ€ Win)์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์›๋˜๋Š” ์–ด๋Œ‘ํ„ฐ ๋ชฉ๋ก์„ ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์€ setupBeforeClass ์—์„œ ์ •์  ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๊ณต๊ธ‰์ž๊ฐ€ ํ•ด๋‹น ์†์„ฑ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๊ณต๊ธ‰์ž๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์†์„ฑ์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐœ๊ฒฌ๋œ ๋ฒ„์ „: 3.7.14

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@epdenouden JIT? PHP์šฉ JIT๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. PHP7.x ๋ฐ PHP8.x ๋˜๋Š” PHPUnit7.x ๋ฐ PHPUnit8.x์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?!

@MAChitgarha PHP8์ด Just-In-Time _compiler_๋ฅผ ์–ป๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ˜ผ๋ž€์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋™์ผํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž ๊ตฌํ˜„ ์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Just-in-time _loader_(์ผ๋ช… ์ง€์—ฐ ๋กœ๋”ฉ). ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ดˆ๊ธฐํ™”ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ PHP ์–ธ์–ด ์ž์ฒด์˜ ๊นŒ๋‹ค๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ณง ์ถœ์‹œ๋  PHP ๋ฒ„์ „ 8 JIT์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ชจ๋“  ์ž‘์—…์€ ๊ตฌ์„ฑ ๊ตฌ๋ฌธ ๋ถ„์„, ํ…Œ์ŠคํŠธ ๋กœ๋“œ ๋ฐ ์‹คํ–‰ ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๋Š” PHPUnit ๋‚ด๋ถ€ ๊นŠ์ˆ™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉด ์ œ๋Œ€๋กœ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ฎ์•„์ง„ GCP ๋˜๋Š” AWS ์ธ๋ณด์ด์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ . ๐Ÿ’ธ

๋ชจ๋“  21 ๋Œ“๊ธ€

์ •์  ๋ฆฌ์†Œ์Šค๊ฐ€ setupBeforeClass ์—์„œ ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ์ˆœ์„œ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๊ฐ€ ์ •์ ์ด๊ฑฐ๋‚˜ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์— ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ •๋ง ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋Œ‘ํ„ฐ๋ฅผ ์ง€์—ฐ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ์ˆœ์„œ๋Š” ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•œ ์„ธ์ƒ์—์„œ ์šฐ๋ฆฌ๋Š” B/C๋ฅผ ๊นจ๊ณ  ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž๊ฐ€ Countable ๋ฅผ ํ™•์žฅํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋˜๋„๋ก ์š”๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ํ›จ์”ฌ ๊นจ๋—ํ•œ ์ƒํ™ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ @whatthejeff ๋ฌด์—‡์„ ์šฐ๋ฆฌ๋Š” ์ผ์„ ๋๋‚ธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ธ‰์ž์—์„œ ๋ฐ˜ํ™˜๋  ๋•Œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋ž˜ํ•‘ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋” ๊น”๋”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@sebastianbergmann ok ๊ทธ๋“ค์ด ์™œ ์ „์— ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (๋‹น์‹ ์ด ๊ดœ์ฐฎ๋‹ค๋ฉด ๋ณ€๊ฒฝ๋˜๋Š” PR์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ธ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ „ ์‚ฌ๋žŒ์„ ๋ณด๋ฉด ํ•œ ๊ณต๊ธ‰์ž์—์„œ ๋‹ค๋ฅธ ๊ณต๊ธ‰์ž๋กœ์˜ ์ข…์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ต์žฅ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

@vicb , ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ ๊ด€๋ จ PR์„ ๊ธฐ๊บผ์ด ๋ณ‘ํ•ฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์žฅ๋ฉด์— ์•ฝ๊ฐ„ ๋Šฆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ์ข…์†์„ฑ์ด ์žˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ์€ @dataProvider ์ฃผ์„์„ ๋ฒ„๋ฆฌ๊ณ  ๋Œ€์‹  yield ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@srosato ๋‚˜๋Š” ๋ฐ”๋ณด์ž…๋‹ˆ๋‹ค (๋‚˜๋Š” yield๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ์žˆ๋Š” ์˜ˆ๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ https://gist.github.com์„ ํ†ตํ•ด.

@dataProvider ์— ์„ค์ • ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๊ทธ๋‹ค์ง€ ํฌ์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ์—์„œ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•˜๊ณ  eval ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

public function myProvider() {
    return [
        'new Klass("param 1", "param 2")',
        'new Klass("param 1", "param 2")',
    ];
}

/**
 * <strong i="8">@dataProvider</strong> myProvider
 */
public testMyFunction($instance_str) {
    $klass = eval("return {$instance_str};");
    # continue testing $klass ...
}

๋‚ด ๋‘ ์„ผํŠธ:

์ •์  ์†์„ฑ(๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์Œ)์— ์˜์กดํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž ๋Œ€์‹ ์— setUp() ๋ฉ”์„œ๋“œ์—์„œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ํด๋ž˜์Šค ๋ฉค๋ฒ„๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ/๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
tearDown() ์—์„œ null๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ clear() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ์ „์ฒด์˜ ์ข…์†์„ฑ์ด ๋„ˆ๋ฌด ๋งŽ์ง€ ์•Š์€ ํ•œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ํŽธ์•ˆํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ์ข…์†์„ฑ์ด ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ ์ „์ฒด ๋””์ž์ธ์„ ์ง€๋‚˜์น˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, DB ์—ฐ๊ฒฐ์„ setUpBeforeClass() ์„ค์ •๋œ ์ •์  ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  $queryBuilder ์˜ ํด๋ž˜์Šค ๋ฉค๋ฒ„๋กœ ์—ฐ๊ฒฐ์„ ์ฃผ์ž…ํ•˜๋Š” setUp() (๋Œ€์‹  ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž์—์„œ ๋ฐ˜ํ™˜).

ํ•ด๊ฒฐ์ฑ…์€ ์ƒˆ๋กœ์šด ๊ฐœ์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ทธ ์•ˆ์— static ๋งŒํผ ๋งŽ์€ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๋ชจ๋‘ ์„ค์ •ํ•˜๊ณ  ๋ฐ˜ํ™˜(๋˜๋Š” ์–‘๋ณด)ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด _๋ณ€์ˆ˜๋Š” ํ•œ ๋ฒˆ๋งŒ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค_. ์ œ๊ณต์ž๊ฐ€ 10๊ฐœ์ด๋“  ๋ญ๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ setUpBeforeClass() ๋˜๋Š” setUp() ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์—์„œ ๊ทธ๊ฒƒ์„ ๋ณด์‹ญ์‹œ์˜ค:

private static function getData()
{
    static $data, $anotherData;

    if (!isset($data)) {
        $data = new TestClass();
        $anotherData = [];
    }

    return [
        $data,
        // Or: clone $data
        $anotherData,
    ];
}

public static function setUpBeforeClass()
{
    list(self::$sampleJson, self::$sampleData) = self::getData(); 
}

public function sampleProvider()
{
    $data = self::getData();

    return [
        $data
    ];
}

@MAChitgarha ์–ด์ œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ ๋•๋ถ„์— ์ด ํ‹ฐ์ผ“์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. :)

์ €๋Š” #3736์˜ ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž ๋กœ์ง์„ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์‹œ์ž‘ ์‹œ ํ™œ๋™์ด ๋” ์ด์ƒ ๊ธ‰์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž๋Š” ๊ณ ์ • setUpBeforeClass ๋ฐ setUp ์ดํ›„์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„์ •์  ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง
  • ๋ฐœ์ „๊ธฐ๋Š” ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค

@epdenouden ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค ! ;) ๋ชฉ๋ก์˜ ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ์ข‹์€ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์ •์  ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง

ํ˜„์žฌ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ €๋Š” ํ•ญ์ƒ ์ •์  ๋ฐ์ดํ„ฐ ๋Œ€์‹  ๋น„์ •์  ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋ฅผ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๋ฉฐ ๋ฌธ์ œ ์—†์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(PHPUnit 7.5.6 ์‚ฌ์šฉ). ๋‚ด๊ฐ€ ์ž˜๋ชป?

ํ˜„์žฌ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ €๋Š” ํ•ญ์ƒ ์ •์  ๋ฐ์ดํ„ฐ ๋Œ€์‹  ๋น„์ •์  ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋ฅผ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๋ฉฐ ๋ฌธ์ œ ์—†์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(PHPUnit 7.5.6 ์‚ฌ์šฉ). ๋‚ด๊ฐ€ ์ž˜๋ชป?

์•„๋‹ˆ, ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค! ์ œ ํ‘œํ˜„์ด ์ •ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฝ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

private static function getDataFromDataProviderAnnotation($allTheParameters): ?iterable
    // code for locating the data provider
    // [...]
                if ($dataProviderMethod->isStatic()) {
                    $object = null;
                } else {
                    $object = $dataProviderClass->newInstance();
                }

    // code for preparing returned data rows
    // [...]
}

์—ฌ๊ธฐ์— ๋”๋Ÿฌ์šด ์ž‘์€ ๋น„๋ฐ€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋น„์ •์  ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ
  • ๊ทธ๋“ค์€ ์‹ค์ œ instanceof ์—์„œ ํ˜ธ์ถœ๋˜์ง€๋งŒ...
  • ํ”ฝ์Šค์ณ์™€ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜๋Š” _๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค_

๋ฐ์ดํ„ฐ ์ œ๊ณต์ž ๋ฆฌํŒฉํ† ๋ง๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ƒ๊ฐํ•˜๊ณ  ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์…จ์Šต๋‹ˆ๋‹ค! ๊ฐœ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ผํ•œ ์œ ํ˜•์ด๋‚˜ ๋ณต์ œ๋ณธ์ด ์•„๋‹ˆ๋ผ ์˜ˆ์ƒ๋˜๋Š” ๊ฐœ์ฒด์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. โ˜•๏ธ ๊ทธ๋ฆฌ๊ณ  ๐Ÿฐ ๋‹น์‹ ์ด ์•”์Šคํ…Œ๋ฅด๋‹ด์— ์žˆ์„ ๋•Œ ๋‚˜์—๊ฒŒ.

@MAChitgarha ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹ค์ œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. https://github.com/epdenouden/phpunit/blob/4718e0bb470170b2da46bf0e05b7275110a2a29d/tests/_files/DataProviderInstanceTest.php#L14 -L27

image

@epdenouden ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์–ด๋–ค ์‹คํŒจ๋„ ์–ป์ง€ ์•Š์Šต๋‹ˆ๋‹ค! PHPUnit 7.5.13์—์„œ ์–ด์„ค์…˜์€ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ๋น„ํ˜ธํ™˜์„ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ 8.2๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—… ์ค‘์ธ ์ง€์—ฐ ๋กœ๋”ฉ ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž ๋ถ„๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— 7.5.x๋ฅผ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๋ฉด ๋น„์ •์  ๊ณต๊ธ‰์ž ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ–ˆ๋˜ ๋‹ค๋ฅธ ์ด์ „ ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ ์ •ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ : ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ์ด๋ฏธ ๋งค์šฐ ์œ ์šฉํ•œ ํ…Œ์ŠคํŠธ์— ์˜๊ฐ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. :)

๊ทธ๋ฆฌ๊ณ  @MAChitgarha ์˜ˆ, BC ํœด์‹์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@epdenouden ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ PHPUnit 7.5.13์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณง 8.2.*๋กœ ์—…๋ฐ์ดํŠธํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ์†Œ์‹์€ BC-break๊ฐ€ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PHPUnit ์ž์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ์„œ ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ˆ˜์ •์€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค! :)

๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ์†Œ์‹์€ BC-break๊ฐ€ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PHPUnit ์ž์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ์„œ ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ˆ˜์ •์€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค! :)

์•„์ฃผ ์ข‹์€ ์ด์œ  ์—†์ด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ์ค‘๋‹จ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ @sebastianbergmann ์ด ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด

์˜ˆ, ํ…Œ์ŠคํŠธ์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž/๊ฐœ๋ฐœ์ž๋กœ์„œ ๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ž์› ๋ด‰์‚ฌ์ž ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค.

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: ์œ„์˜ ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ๋กœ ๋ฒ„์ „ 7.x์™€ 8.x์—์„œ ๋ชจ๋‘ ์ž‘๋™ํ•˜๋ฉฐ JIT ํ”„๋กœํ† ํƒ€์ž…์—์„œ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ์›๋ž˜ ์ฝ”๋“œ ํ๋ฆ„๊ณผ ํ›จ์”ฌ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋ฒ„๊ทธ์˜ ๊ฒฐ๊ณผ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ์ „ํžˆ ๋” ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ๋…ผ๋ฆฌ์ผ ์ˆ˜๋„ ์žˆ๊ณ , PHP์˜ ๊ฐ์ฒด ๋ฐ ๋ฆฌํ”Œ๋ ‰์…˜์— ๋Œ€ํ•ด ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ฒƒ, ์กฐํšŒํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๋˜๋Š” ๋‚ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ˆœ์ง„ํ•œ ํ…Œ์ŠคํŠธ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ”ฌ

@epdenouden JIT? PHP์šฉ JIT๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. PHP7.x ๋ฐ PHP8.x ๋˜๋Š” PHPUnit7.x ๋ฐ PHPUnit8.x์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?!

@epdenouden JIT? PHP์šฉ JIT๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. PHP7.x ๋ฐ PHP8.x ๋˜๋Š” PHPUnit7.x ๋ฐ PHPUnit8.x์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?!

@MAChitgarha PHP8์ด Just-In-Time _compiler_๋ฅผ ์–ป๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ˜ผ๋ž€์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋™์ผํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž ๊ตฌํ˜„ ์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Just-in-time _loader_(์ผ๋ช… ์ง€์—ฐ ๋กœ๋”ฉ). ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ดˆ๊ธฐํ™”ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ PHP ์–ธ์–ด ์ž์ฒด์˜ ๊นŒ๋‹ค๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ณง ์ถœ์‹œ๋  PHP ๋ฒ„์ „ 8 JIT์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ชจ๋“  ์ž‘์—…์€ ๊ตฌ์„ฑ ๊ตฌ๋ฌธ ๋ถ„์„, ํ…Œ์ŠคํŠธ ๋กœ๋“œ ๋ฐ ์‹คํ–‰ ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๋Š” PHPUnit ๋‚ด๋ถ€ ๊นŠ์ˆ™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉด ์ œ๋Œ€๋กœ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ฎ์•„์ง„ GCP ๋˜๋Š” AWS ์ธ๋ณด์ด์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ . ๐Ÿ’ธ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰