Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

サバンナ便り〜自動テストに関する連載で得られた知見のまとめ(2023年5月版)〜 / Auto...

サバンナ便り〜自動テストに関する連載で得られた知見のまとめ(2023年5月版)〜 / Automated Test Knowledge from Savanna 202305 edition

2023/05/17(水)
Qiita Conference 2023

Takuto Wada

May 17, 2023
Tweet

More Decks by Takuto Wada

Other Decks in Programming

Transcript

  1. /** * @test * @group learning */ public function DateTimeのaddは自身の状態を変更しつつ自身を返す():

    void { $halloween = new \DateTime('2021-10-31'); $oneYear = \DateInterval::createFromDateString('1 year'); $halloween2022 = $halloween->add($oneYear); $this->assertSame($halloween, $halloween2022); $this->assertEquals('2022-10-31', $halloween->format('Y-m-d')); $this->assertEquals('2022-10-31', $halloween2022->format('Y-m-d')); } /** * @test * @group learning */ public function DateTimeImmutableのaddは自身の状態を変更せず新しい状態を伴う新しいインスタンスを返す(): void { $halloween = new \DateTimeImmutable('2021-10-31'); $oneYear = \DateInterval::createFromDateString('1 year'); $halloween2022 = $halloween->add($oneYear); $this->assertNotSame($halloween, $halloween2022); $this->assertEquals('2021-10-31', $halloween->format('Y-m-d')); $this->assertEquals('2022-10-31', $halloween2022->format('Y-m-d')); } %BUF5JNFͱ%BUF5JNF*NNVUBCMFͷҧ͍Λֶशςετʹ͢Δ ֶशςετʢֶͼ͕໨తͷςετʣΛ ݟ෼͚ΔͨΊʹ MFBSOJOHλάΛ͚͍ͭͯ·͢ ֶ͕͜͜ͼ ֶ͕͜͜ͼ
  2. /** * @test * @group learning */ public function 同じ時刻を指している場合はタイムゾーンが異なっても等価とみなされる():

    void { $utc = new DateTimeImmutable('2021-12-24T15:00:00', new DateTimeZone('UTC')); $jst = new DateTimeImmutable('2021-12-25T00:00:00', new DateTimeZone('Asia/Tokyo')); $this->assertTrue($utc == $jst); } ٙ໰Λςετʹ͢Δ ςετʹฉ͍ͯΈΕ͹͍͍
  3. ί ϯ ε τ ϥ Ϋ λ ͸  

    Ұ ճ ͠ ͔ ݺ ΂ ͳ ͍ ͱ   ࡨ ֮ ͠ ͯ ͍ ͨ ʁ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ Ұ ମ  ͍ ͭ ͔ Β ŠŠŠŠŠŠ
  4. /** * @test * @group learning */ public function コンストラクタをもう一度呼ぶと破壊的変更ができてしまう():

    void { $dt = new \DateTimeImmutable('2021-12-24'); $this->assertSame('2021-12-24', $dt->format('Y-m-d')); $dt->__construct('2022-01-01'); $this->assertSame('2022-01-01', $dt->format('Y-m-d')); } ͳΜʜʜͩͱʜʜʂʁ  ໌ࣔతʹݺ΂ͯ͠·͏ ༨ஊ͜ͷςετίʔυΛ͖͔͚ͬʹQIQTSDʹJTTVFͱͯ͠ใࠂ͞Εɺٞ࿦͕ߦΘΕ·ͨ͠ɻ IUUQTHJUIVCDPNQIQQIQTSDJTTVFT ༨ஊ͜ͷςετίʔυΛ͖͔͚ͬʹ੩తղੳπʔϧ1)14UBOͱ1TBMNʹػೳఏҊ͕ߦΘΕɺ 1)14UBOʹ!NVOP@͞Μ͕࡞੒ͨ͠QVMMSFRVFTU͕࠾༻͞ΕɺϦϦʔε͞Ε·ͨ͠ɻ IUUQTHJUIVCDPNQIQTUBOQIQTUBOTSDQVMM
  5. ِཅੑͱِӄੑͷύλʔϯ w ِཅੑ w ੬͍ςετ CSJUUMFUFTU GSBHJMFUFTU  w ৴པෆೳςετ

    fl BLZUFTU  w ِӄੑ w ۭৼΓ w ΧόϨοδෆ଍ w ςετର৅ϩδοΫͷςετίʔυ΁ͷ࿙Εग़͠
  6. // プロダクトコード class Item { // コンストラクタ割愛 tax_amount() { const

    rate = (this.tax_rate / 100); return (this.price / (1 + rate)) * rate; } } // テストコード it('税込価格から税額を返す', () => { const item = new Item('技評茶', 130, 8); const expected = (130 / (1 + (8 / 100))) * (8 / 100); assert.equal(item.tax_amount(), expected); }); ྫςετର৅ϩδοΫͷςετίʔυ΁ͷ࿙Εग़͠ ԁະຬͷ୺਺͕ൃੜ͢Δ όά͕͋Δ ςετίʔυͷํ΋ಉ͡ϩδοΫͰ ظ଴஋Λܭࢉ͍ͯ͠ΔͷͰ ςετ͕੒ޭͯ͠͠·͏
  7. 4NBMM 
 ʢ୯Ұϓϩηεʣ .FEJVN 
 ʢ୯ҰϚγϯʣ -BSHF 
 ʢ੍໿ͳ͠ʣ 6OJU

    ൺ཰ େ͍ʹਪ঑ ආ͚͍͕ͨ ͔ͨ͠ͳ͍ͱ͖΋ ࠷ѱ͕ͩ Α͘ݟ͔͚Δ *OUFHSBUJPO ൺ཰ ॻ͚ΔͳΒ ίεύྑ͠ ී௨ Ͱ͖Ε͹ ආ͚͍ͨ && ൺ཰ ݪཧ্ෆՄೳʹ͍͕ۙ খ͍͞γεςϜͳΒՄೳʁ খ͍͞γεςϜ ͳΒՄೳ ී௨͔ͭ $6+ʹߜΓ͍ͨ 5FTU4DPQF 5FTU4J[F 5FTU4DPQFͱ5FTU4J[F
  8. 4NBMM 
 ʢ୯Ұϓϩηεʣ .FEJVN 
 ʢ୯ҰϚγϯʣ -BSHF 
 ʢ੍໿ͳ͠ʣ 6OJU

    ൺ཰ େ͍ʹਪ঑ ආ͚͍͕ͨ ͔ͨ͠ͳ͍ͱ͖΋ ࠷ѱ͕ͩ Α͘ݟ͔͚Δ *OUFHSBUJPO ൺ཰ ॻ͚ΔͳΒ ίεύྑ͠ ී௨ Ͱ͖Ε͹ ආ͚͍ͨ && ൺ཰ ݪཧ্ෆՄೳʹ͍͕ۙ খ͍͞γεςϜͳΒՄೳʁ খ͍͞γεςϜ ͳΒՄೳ ී௨͔ͭ $6+ʹߜΓ͍ͨ 5FTU4DPQF 5FTU4J[F 5FTU4DPQFͱ5FTU4J[F ίεύྑ͠ ίεύѱ͠
  9. Ϣχοτ ΠϯςάϨʔγϣϯ && ίετ ஧࣮ੑ ଎౓ ςετέʔε਺ ߴ ௿ ௿

    ߴ ܾఆੑ ϒϨͷগͳ͍ςετͷ෼ྨج४͸ʜʜʁ
  10. 4NBMM .FEJVN -BSHF ίετ ஧࣮ੑ ଎౓ ςετέʔε਺ ߴ ௿ ௿

    ߴ ܾఆੑ ·ͱΊςετμϒϧͰαΠζμ΢ϯͯ͠ɺ֤αΠζΛϐϥϛουܕʹ഑ஔ͠ɺςετશମͷ৴པੑΛҡ࣋͢Δ ςετμϒϧ ςετμϒϧ ςετ༰қੑઃܭ υϝΠϯઃܭ