-
-
Notifications
You must be signed in to change notification settings - Fork 19.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
✅ Add unit testing framework #26948
✅ Add unit testing framework #26948
Conversation
By using exec_test_failing, we can test that if we omit some configuration, or if we mismatch it, it will be caught. You can even test that certain strings appear in the output, and if not, the tests fail. To do that pass them as extra arguments.
Add some first unit tests Fix `~Timer` if it hadn't initialised Amend `restore_configs` to reset all pins files It would only do it for ramps/RAMPS, but that's an implicit assumption that it's the only board we will ever change. Add test documentation Use macros to auto-collect code tests Use platformio custom actions to run unit tests Avoid a warning
This was rebased and may not be completely functional without the commits that follow.
That appears to have been relatively trivial to get running in a GitHub workflow. I have several temporary commits (which will be reverted) to allow them to run in my personal repo/branch for testing purposes. Output with the previous types.h fix reverted, causing tests to fail Error messages that produced:
|
b40d3a6
to
ea5076d
Compare
.github/workflows/test-builds.yml
Outdated
name: Run All Unit Tests | ||
# These tests will only be able to run on the bugfix-2.1.x branch, until the next release | ||
# pulls them into additional branches. | ||
if: github.repository == 'MarlinFirmware/Marlin' && github.ref == 'refs/heads/bugfix-2.1.x' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While I tested that the workflow worked on my own repo/branch, I didn't test this github.ref
check. I'm attempting to prevent this from running on the 2.1.x branch, since it won't work yet.
If we don't want to gamble whether this will work once merged, we could split this into a new YML file with different branch requirements. I thought it made sense to add it to this file because then it can re-use all the trigger configuration regarding file paths.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That github.ref syntax came from GitHub Copilot.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could also move this to its own action, if that helps to make things cleaner.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Generally speaking it looks good. I just have one cleanup commit to push. Let's try replacing all the test_*.cpp
files with INI files (based on config.ini
). I've been planning to do the same thing for our CI tests, which should make them easier to maintain.
.github/workflows/test-builds.yml
Outdated
name: Run All Unit Tests | ||
# These tests will only be able to run on the bugfix-2.1.x branch, until the next release | ||
# pulls them into additional branches. | ||
if: github.repository == 'MarlinFirmware/Marlin' && github.ref == 'refs/heads/bugfix-2.1.x' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could also move this to its own action, if that helps to make things cleaner.
d37450d
to
5514777
Compare
@thinkyhead I believe it will be automatic since I retained his name on commits in the history, but I'd like to be sure that @costas-basdekis is attributed as one of the authors when it goes in. |
The requested changes have been completed.
This seems to be in good shape as a starting point for a more complete set of tests. After this is merged we can try asking GitHub Copilot to generate more complete tests for our core data type classes and other things. |
Core data types and verifying complex macro behavior are good places to start. I’d like to see us then expand to some of the more complex logic. I believe I have tests in some experiments branches for bilinear subdivision and classic jerk calculations that I may be able to revive. |
Based on the last comment from @thinkyhead, I m going to go ahead and merge this so that we can start adding additional tests. |
commit 02ba6f9 Author: thinkyhead <[email protected]> Date: Fri Apr 19 00:21:25 2024 +0000 [cron] Bump distribution date (2024-04-19) commit dba0010 Author: Andrew <[email protected]> Date: Thu Apr 18 19:04:03 2024 -0400 🎨 Rename some G-code files (MarlinFirmware#26981) commit 90667f6 Author: I3DBeeTech <[email protected]> Date: Fri Apr 19 02:24:17 2024 +0530 🐛 Fix BLACKBEEZMINI fan, info (MarlinFirmware#26983) commit d6961b2 Author: thinkyhead <[email protected]> Date: Wed Apr 17 06:06:51 2024 +0000 [cron] Bump distribution date (2024-04-17) commit 07ebb81 Author: Javlon Sodikov <[email protected]> Date: Wed Apr 17 10:25:22 2024 +0500 🩹Fix ProUI error when !CASELIGHT_USES_BRIGHTNESS (MarlinFirmware#26976) * Fix the compile error with the case light menu Fix the compile error with the case light menu * Add failing test --------- Co-authored-by: Jason Smith <[email protected]> commit 245db73 Author: thinkyhead <[email protected]> Date: Tue Apr 16 18:06:16 2024 +0000 [cron] Bump distribution date (2024-04-16) commit 9342dae Author: Scott Lahteine <[email protected]> Date: Tue Apr 16 12:17:47 2024 -0500 📝 Remove dead PDF links commit 1f84f50 Author: thinkyhead <[email protected]> Date: Mon Apr 15 02:38:10 2024 +0000 [cron] Bump distribution date (2024-04-15) commit 3326c74 Author: Scott Lahteine <[email protected]> Date: Sun Apr 14 16:26:16 2024 -0500 📝 Minor README changes commit 0269106 Author: Scott Lahteine <[email protected]> Date: Sun Apr 14 16:24:14 2024 -0500 🎨 Dagoma D6 followup commit 95d38a8 Author: Sophist <[email protected]> Date: Sun Apr 14 21:04:52 2024 +0100 ✨ Add Dagoma D6 as found in DiscoUltimate v2 TMC (MarlinFirmware#26874) * Add Dagoma D6 board as used in their DiscoUltimate v2 TMC. Taken from the Dagoma fork of Marlin DU_MC branch where it is called FYSETC_DAGOMA_F5 and explicitly confirmed by Dagoma as being the D6: "the BOARD_FYSETC_DAGOMA_F5 is effectively the definition for the D6" --------- Co-authored-by: thisiskeithb <[email protected]> Co-authored-by: Orel <[email protected]> commit dca6afc Author: Chris <[email protected]> Date: Sun Apr 14 20:42:57 2024 +0200 ✨🐛 HC32 - Add SERIAL_DMA, fix SDIO and MEATPACK (MarlinFirmware#26845) * fix meatpack on hc32 * add support for SERIAL_DMA on HC32 * add additional checks in HC32 HAL * migrate HC32 HAL to use app_config.h * fix memory leak in HC32 sdio HAL MarlinFirmware#26845 (comment) * hc32: fail if both EMERGENCY_PARSER and SERIAL_DMA are enabled commit 19684f2 Author: Jason Smith <[email protected]> Date: Sat Apr 13 17:49:08 2024 -0700 ✅ Add unit tests for macros.h (MarlinFirmware#26968) commit 52a5613 Author: Keith Bennett <[email protected]> Date: Sat Apr 13 17:47:16 2024 -0700 ⏪️ Revert unintended README changes (MarlinFirmware#26967) * Revert all the changes that went in with the unit test framework This restored broken links and other changes. Restoring to the prior revision seems the most appropriate action until the intentions of those file changes are known. --------- Co-authored-by: Jason Smith <[email protected]> commit 0683e8a Author: thinkyhead <[email protected]> Date: Sun Apr 14 00:24:15 2024 +0000 [cron] Bump distribution date (2024-04-14) commit 1bb4a04 Author: Jason Smith <[email protected]> Date: Sat Apr 13 14:11:51 2024 -0700 ✅Unit test improvements (MarlinFirmware#26965) * Do not warn about display in unit tests * Treat warnings as errors in unit tests * Report actual filenames with unit tests commit d10861e Author: Jason Smith <[email protected]> Date: Sat Apr 13 12:06:08 2024 -0700 ✅ Add unit testing framework (MarlinFirmware#26948) - Add a framework to build and execute unit tests for Marlin. - Enable unit test execution as part of PR checks. --------- Co-authored-by: Costas Basdekis <[email protected]> Co-authored-by: Scott Lahteine <[email protected]> commit cf7c86d Author: Andrew <[email protected]> Date: Sat Apr 13 14:59:59 2024 -0400 🔧Fix M936 in features.ini (MarlinFirmware#26957) commit d99e150 Author: David Buezas <[email protected]> Date: Sat Apr 13 18:54:25 2024 +0200 ⚡️Reduce DISPLAY_SLEEP_MINUTES overhead (MarlinFirmware#26964)
- Add a framework to build and execute unit tests for Marlin. - Enable unit test execution as part of PR checks. --------- Co-authored-by: Costas Basdekis <[email protected]> Co-authored-by: Scott Lahteine <[email protected]>
I know this is a very late response, but I only recently saw the notification, and wanted to thank everyone involved in this for their patience and guidance, especially Jason. I don't do a lot of 3D printing lately, but I could help with testing if that's something you need. Again, well done on making progress! |
Description
This revives and builds upon an effort from @costas-basdekis several years ago, which provided a way to execute unit tests against various Marlin configurations.
This uses Platform IO's unit testing mechanisms to build and execute tests on a Linux machine.
How to use this feature
This is used through the top-level makefile. It likely only works on Linux or a Linux VM (including WSL).
Execute by running
make tests-code-all-local
ormake tests-code-all-local-docker
.Overall summary of strategy:
Unique config.ini files describing test configurations are placed in sub-folders beneath
test
. PlatformIO recognizes this folder structure and will build one test executable for each folder present.extra_script tooling adds extra commands which will apply the config.ini prior to building each test.
Tests are automatically discovered from test files inside the Marlin/tests directory. The Marlin configuration is available inside these tests, so typical pre-processor mechanisms can be used to determine whether a configuration is suitable to run a test, or to alter the behavior of a test.
Will run automatically with our existing CI tests. This was tested in my developer branch, but will have to be verified as soon as this is merged.
How were the initial tests selected?
Some of these tests were simple sanity checks originally added by Costas when he initially prototyped the feature. The
types
tests were added to specifically test a recently fixed Boolean casting problem which caused major issues across several Marlin subsystems.Possible future improvements
TEST
macros.Requirements
Linux development environment. This can be executed inside Windows Subsystem for Linux (I've only tested with docker). It may be possible to get it working on other platforms, but this has not been attempted.
Benefits
Provides a mechanism to write tests which can be easily executed and automated by any developer in the world. These can verify correct behavior, as well as protect against future regression.
Configurations
N/A
Related Issues
N/A