Upgrade to Pro — share decks privately, control downloads, hide ads and more …

組込みソフトウェア基礎_連続講座#8_テスト駆動開発の魅力を語る〜実装編〜

k-abe
February 16, 2023

 組込みソフトウェア基礎_連続講座#8_テスト駆動開発の魅力を語る〜実装編〜

2023/2/16(木)Twitterスペースの連続イベント(https://twitter.com/i/spaces/1dRKZMXygnQxB)の説明資料です

前々回の【ホスト編】ではLEDドライバをテーマにホストPCでテスト駆動開発(以降TDD)した際の概要を話しました。
前回の【ターゲット編】ではマイコンでTDDを試した話をしました。
今回は【実装編】としてホスト編・ターゲット編でテストコードを書いたときの話です。

※リンクが有効な資料はこちらを参照してください。
https://www.docswell.com/s/juraruming/5VV7PQ-2023-02-16-122410

k-abe

February 16, 2023
Tweet

More Decks by k-abe

Other Decks in Programming

Transcript

  1. ૊ ࠐ Έ ι ϑ τ ΢ Σ Ξ ج

    ૅ ݱ৔ϊ΢ϋ΢Λ஌Ζ͏ ςετۦಈ։ൃͷັྗΛޠΔ ʙ࣮૷ฤʙ 2023/2/16ʢ໦ʣ 19:30ʙ20:15 Twitterεϖʔε: https://twitter.com/i/spaces/1dRKZMXygnQxB
  2. ɾϗετͱ͸? ɹ TDDΛ࣮ߦ͢Δ؀ڥͰɺ ϗετ → ϗετPCͰTDD͢Δɻ λʔήοτˠ૊ΈࠐΈ૷ஔͰTDD͢Δɻɹ ϗετɾλʔήοτͱ͸? 6 ϗετPC

    → ϗετ ૊ΈࠐΈ૷ஔ → λʔήοτ LED ▪ ϗετͰTDD͢Δಛ௃ ɾ૊ΈࠐΈ૷ஔʹςετϓϩάϥϜΛμ΢ ϯϩʔυ͠ͳͯ͘ྑ͍ͷͰૣ͘ςετͰ͖ Δɻ ɾϋʔυ΢ΣΞΛ੍ޚ͠ͳ͍ɻϋʔυ΢Σ ΞΛԾ૝తʹѻ͏ɻ ɾςετϑϨʔϜϫʔΫʹࣗ༝౓͕͋Δɻ ɹGoogleTest, CppUTest, Unity, ͦͷଞ ▪ λʔήοτ ɾϗετʹൺ΂ͯςετΛճ͢ʲεϐʔ υʳ͕஗͍(ϗετˠλʔήοτ΁ͷϓϩ άϥϜͷμ΢ϯϩʔυͳͲ)ɻ ɾϋʔυ΢ΣΞΛ੍ޚ͢Δɻϋʔυ΢ΣΞ ΛབྷΊͨςετ͕Ͱ͖Δɻ ɾ࢖͑ΔςετϑϨʔϜϫʔΫʹ੍ݶ͕Ͱ ͯ͘ΔɻϚΠίϯ͸RAM͕গͳ͍ͨΊɻ ɹCppUTest, Unity, ͦͷଞ
  3. ʲϗετʳ ▪ϗετPC: macOS Monterey όʔδϣϯ 12.6 ▪ςετϑϨʔϜϫʔΫ: CppUTest 4.0 ▪ίϯύΠϥ:

    Apple clang version 11.0.0 (clang-1100.0.33.8) ▪ςετର৅ϓϩάϥϛϯάݴޠ: C ▪ϏϧυγεςϜ: cmake 3.21.1 ʲλʔήοτʳ ※λʔήοτ͸ಈ࡞֬ೝͰ͖·ͤΜͰͨ͠ɻߏ૝ͷΈɻ ɾSTM32CubeIDE Version: 1.11.0 ɾςετϑϨʔϜϫʔΫ: CppUTest 4.0(ϗετͱಉ͡) ʲࠓճͷ؀ڥʹ͍ͭͯʳ 7
  4. ϗετฤͷҰ࿈ͷखॱ͸࣍ͷࢿྉʹॻ͖·ͨ͠ɻ Α͚Ε͹ࢀর͍ͯͩ͘͠͞ɻ ϗετฤࢿྉɿ ૊ΈࠐΈιϑτ΢ΣΞجૅ_ʲ࿈ଓߨ࠲ #6ʳTDD#2 LED ド ϥΠ バ (ϗ

    ετPCฤ)_slide https://www.docswell.com/s/juraruming/ 5G31LZ-2022-10-31-220730 ιʔείʔυ͸ͪ͜Βɻ https://github.com/grace2riku/evkart_tdd/tree/LedDriver_221031 ʲϗετฤͷςετίʔυ࣮૷ʳ 8
  5. ▪ςετ؀ڥΛͭ͘Δ ɹCppUTestͷ৔߹ɺ࣍ͷεΫϦϓτ࣮ߦͰTDD؀ڥͷ਽ܗ͕ͭ͘ΕΔɻ $ NewPackageDirs HallSensorLedDriver creating src/HallSensorLedDriver creating include/HallSensorLedDriver creating

    tests/HallSensorLedDriver $ NewCModule.sh HallSensorLedDriver HallSensorLedDriver creating include/HallSensorLedDriver/HallSensorLedDriver.h creating src/HallSensorLedDriver/HallSensorLedDriver.c creating tests/HallSensorLedDriver/HallSensorLedDriverTest.cpp ਽ܗͷιʔείʔυΛϏϧυର৅ʹ௥Ճ͠ɺςετΛॻ͍͍ͯ͘ɻ ϗετฤࢿྉͷp28Λࢀরɻ ʲϗετฤͷςετίʔυ࣮૷ʳ 11
  6. ▪ςετΛॻ͘ ɹςετίʔυɿ // υϥΠόΛॳظԽͨ͠Βɺ͢΂ͯͷLED͕ফ౮͍ͯ͠Δ TEST(HallSensorLedDriver, LedsOffAfterCreate) { unsigned char virtualLeds

    = 0xff; // ফ౮֬ೝͷͨΊʹLEDΦϯʹॳظԽ HallSensorLedDriver_Create(&virtualLeds); // υϥΠόॳظԽ BYTES_EQUAL(0, virtualLeds); // ॳظԽޙʹ0(LEDΦϑ)͔֬ೝ } ιʔείʔυɿ https://github.com/grace2riku/evkart_tdd/blob/LedDriver_221031/tests/ HallSensorLedDriver/HallSensorLedDriverTest.cpp ʲϗετฤͷςετίʔυ࣮૷ʳ 12
  7. ▪ςετΛॻ͘ ɹϓϩμΫτίʔυɿ υϥΠόΛॳظԽ(͢΂ͯͷLEDΛOFF͢Δ) static unsigned char* hallSensorLedsAddress; void HallSensorLedDriver_Create(unsigned char*

    address) { hallSensorLedsAddress = address; *hallSensorLedsAddress = 0; } ιʔείʔυɿ https://github.com/grace2riku/evkart_tdd/blob/LedDriver_221031/ src/HallSensorLedDriver/HallSensorLedDriver.c ʲϗετฤͷςετίʔυ࣮૷ʳ 13
  8. ςετίʔυ͸ͪ͜Β(ςετࣗମʹҙຯ͸ͳ͍Ͱ͢) https://github.com/grace2riku/hello_stm32_cpputest/blob/main/446re_test/Core/Src/ test_src.cpp #include "CppUTest/TestHarness.h" TEST_GROUP(FirstTestGroup) { }; TEST(FirstTestGroup, FirstTest)

    // ඞࣦͣഊ͢Δςετ { FAIL("FAIL: FirstTestGroup, FirstTest\n"); } TEST(FirstTestGroup, SecondTest) // ඞͣ੒ޭ͢Δςετ Ҿ਺ʹ0Λ༩͍͑ͯΔ͔Β { CHECK_EQUAL_ZERO(0); } TEST(FirstTestGroup, IntSize) // ੒ޭ͢Δςετ STM32ϚΠίϯ͸32bitͰint͸4byteͷͨΊ { LONGS_EQUAL(4, sizeof(int)); } ʲλʔήοτฤͷςετίʔυ࣮૷ʳ 15
  9. mainؔ਺͔Βςετ࣮ߦ͠·͢ɻ https://github.com/grace2riku/hello_stm32_cpputest/blob/main/446re_test/Core/Src/main.cpp int main(void) { const char* empty[] = {};

    const char* command_v[] = {"cpputest", "-v"}; printf("\n----- RunAllTests(0, empty) -----\n"); CommandLineTestRunner::RunAllTests(0, empty); printf("\n----- RunAllTests(2, command_v) -----\n"); CommandLineTestRunner::RunAllTests(2, command_v); while (1) { } } ʲλʔήοτฤͷςετίʔυ࣮૷ʳ 16
  10. ςετͷ࣮ߦ݁Ռ #include "CppUTest/TestHarness.h" TEST_GROUP(FirstTestGroup) { }; TEST(FirstTestGroup, FirstTest) // ඞࣦͣഊ͢Δςετ

    { FAIL("FAIL: FirstTestGroup, FirstTest\n"); } TEST(FirstTestGroup, SecondTest) // ඞͣ੒ޭ͢Δςετ Ҿ਺ʹ0Λ༩͍͑ͯΔ͔Β { CHECK_EQUAL_ZERO(0); } TEST(FirstTestGroup, IntSize) // ੒ޭ͢Δςετ STM32ϚΠίϯ͸32bitͰint͸4byteͷͨΊ { LONGS_EQUAL(4, sizeof(int)); } ಈը͸ͪ͜Βˠhttps://youtu.be/8rb3picKkjw ʲλʔήοτฤͷςετίʔυ࣮૷ʳ 17