193 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			193 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# Unity - Getting Started
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Welcome
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Congratulations. You're now the proud owner of your very own pile of bits! What
							 | 
						||
| 
								 | 
							
								are you going to do with all these ones and zeros? This document should be able
							 | 
						||
| 
								 | 
							
								to help you decide just that.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Unity is a unit test framework. The goal has been to keep it small and
							 | 
						||
| 
								 | 
							
								functional. The core Unity test framework is three files: a single C file and a
							 | 
						||
| 
								 | 
							
								couple header files. These team up to provide functions and macros to make
							 | 
						||
| 
								 | 
							
								testing easier.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Unity was designed to be cross-platform. It works hard to stick with C standards
							 | 
						||
| 
								 | 
							
								while still providing support for the many embedded C compilers that bend the
							 | 
						||
| 
								 | 
							
								rules. Unity has been used with many compilers, including GCC, IAR, Clang,
							 | 
						||
| 
								 | 
							
								Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to
							 | 
						||
| 
								 | 
							
								work with a new target.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Overview of the Documents
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Unity Assertions reference
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This document will guide you through all the assertion options provided by
							 | 
						||
| 
								 | 
							
								Unity. This is going to be your unit testing bread and butter. You'll spend more
							 | 
						||
| 
								 | 
							
								time with assertions than any other part of Unity.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Unity Assertions Cheat Sheet
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This document contains an abridged summary of the assertions described in the
							 | 
						||
| 
								 | 
							
								previous document. It's perfect for printing and referencing while you
							 | 
						||
| 
								 | 
							
								familiarize yourself with Unity's options.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Unity Configuration Guide
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This document is the one to reference when you are going to use Unity with a new
							 | 
						||
| 
								 | 
							
								target or compiler. It'll guide you through the configuration options and will
							 | 
						||
| 
								 | 
							
								help you customize your testing experience to meet your needs.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Unity Helper Scripts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This document describes the helper scripts that are available for simplifying
							 | 
						||
| 
								 | 
							
								your testing workflow. It describes the collection of optional Ruby scripts
							 | 
						||
| 
								 | 
							
								included in the auto directory of your Unity installation. Neither Ruby nor
							 | 
						||
| 
								 | 
							
								these scripts are necessary for using Unity. They are provided as a convenience
							 | 
						||
| 
								 | 
							
								for those who wish to use them.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Unity License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								What's an open source project without a license file? This brief document
							 | 
						||
| 
								 | 
							
								describes the terms you're agreeing to when you use this software. Basically, we
							 | 
						||
| 
								 | 
							
								want it to be useful to you in whatever context you want to use it, but please
							 | 
						||
| 
								 | 
							
								don't blame us if you run into problems.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Overview of the Folders
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you have obtained Unity through Github or something similar, you might be
							 | 
						||
| 
								 | 
							
								surprised by just how much stuff you suddenly have staring you in the face.
							 | 
						||
| 
								 | 
							
								Don't worry, Unity itself is very small. The rest of it is just there to make
							 | 
						||
| 
								 | 
							
								your life easier. You can ignore it or use it at your convenience. Here's an
							 | 
						||
| 
								 | 
							
								overview of everything in the project.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `src` - This is the code you care about! This folder contains a C file and two
							 | 
						||
| 
								 | 
							
								header files. These three files _are_ Unity.
							 | 
						||
| 
								 | 
							
								- `docs` - You're reading this document, so it's possible you have found your way
							 | 
						||
| 
								 | 
							
								into this folder already. This is where all the handy documentation can be
							 | 
						||
| 
								 | 
							
								found.
							 | 
						||
| 
								 | 
							
								- `examples` - This contains a few examples of using Unity.
							 | 
						||
| 
								 | 
							
								- `extras` - These are optional add ons to Unity that are not part of the core
							 | 
						||
| 
								 | 
							
								project. If you've reached us through James Grenning's book, you're going to
							 | 
						||
| 
								 | 
							
								want to look here.
							 | 
						||
| 
								 | 
							
								- `test` - This is how Unity and its scripts are all tested. If you're just using
							 | 
						||
| 
								 | 
							
								Unity, you'll likely never need to go in here. If you are the lucky team member
							 | 
						||
| 
								 | 
							
								who gets to port Unity to a new toolchain, this is a good place to verify
							 | 
						||
| 
								 | 
							
								everything is configured properly.
							 | 
						||
| 
								 | 
							
								- `auto` - Here you will find helpful Ruby scripts for simplifying your test
							 | 
						||
| 
								 | 
							
								workflow. They are purely optional and are not required to make use of Unity.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## How to Create A Test File
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Test files are C files. Most often you will create a single test file for each C
							 | 
						||
| 
								 | 
							
								module that you want to test. The test file should include unity.h and the
							 | 
						||
| 
								 | 
							
								header for your C module to be tested.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Next, a test file will include a `setUp()` and `tearDown()` function. The setUp
							 | 
						||
| 
								 | 
							
								function can contain anything you would like to run before each test. The
							 | 
						||
| 
								 | 
							
								tearDown function can contain anything you would like to run after each test.
							 | 
						||
| 
								 | 
							
								Both functions accept no arguments and return nothing. You may leave either or
							 | 
						||
| 
								 | 
							
								both of these blank if you have no need for them. If you're using a compiler
							 | 
						||
| 
								 | 
							
								that is configured to make these functions optional, you may leave them off
							 | 
						||
| 
								 | 
							
								completely. Not sure? Give it a try. If you compiler complains that it can't
							 | 
						||
| 
								 | 
							
								find setUp or tearDown when it links, you'll know you need to at least include
							 | 
						||
| 
								 | 
							
								an empty function for these.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The majority of the file will be a series of test functions. Test functions
							 | 
						||
| 
								 | 
							
								follow the convention of starting with the word "test_" or "spec_". You don't HAVE
							 | 
						||
| 
								 | 
							
								to name them this way, but it makes it clear what functions are tests for other
							 | 
						||
| 
								 | 
							
								developers.  Also, the automated scripts that come with Unity or Ceedling will default
							 | 
						||
| 
								 | 
							
								to looking for test functions to be prefixed this way. Test functions take no arguments 
							 | 
						||
| 
								 | 
							
								and return nothing. All test accounting is handled internally in Unity.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Finally, at the bottom of your test file, you will write a `main()` function.
							 | 
						||
| 
								 | 
							
								This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and
							 | 
						||
| 
								 | 
							
								finally `UNITY_END()`.This is what will actually trigger each of those test
							 | 
						||
| 
								 | 
							
								functions to run, so it is important that each function gets its own `RUN_TEST`
							 | 
						||
| 
								 | 
							
								call.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Remembering to add each test to the main function can get to be tedious. If you
							 | 
						||
| 
								 | 
							
								enjoy using helper scripts in your build process, you might consider making use
							 | 
						||
| 
								 | 
							
								of our handy generate_test_runner.rb script. This will create the main function
							 | 
						||
| 
								 | 
							
								and all the calls for you, assuming that you have followed the suggested naming
							 | 
						||
| 
								 | 
							
								conventions. In this case, there is no need for you to include the main function
							 | 
						||
| 
								 | 
							
								in your test file at all.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When you're done, your test file will look something like this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```C
							 | 
						||
| 
								 | 
							
								#include "unity.h"
							 | 
						||
| 
								 | 
							
								#include "file_to_test.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void setUp(void) {
							 | 
						||
| 
								 | 
							
								    // set stuff up here
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void tearDown(void) {
							 | 
						||
| 
								 | 
							
								    // clean stuff up here
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void test_function_should_doBlahAndBlah(void) {
							 | 
						||
| 
								 | 
							
								    //test stuff
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void test_function_should_doAlsoDoBlah(void) {
							 | 
						||
| 
								 | 
							
								    //more test stuff
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main(void) {
							 | 
						||
| 
								 | 
							
								    UNITY_BEGIN();
							 | 
						||
| 
								 | 
							
								    RUN_TEST(test_function_should_doBlahAndBlah);
							 | 
						||
| 
								 | 
							
								    RUN_TEST(test_function_should_doAlsoDoBlah);
							 | 
						||
| 
								 | 
							
								    return UNITY_END();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It's possible that you will need more customization than this, eventually.
							 | 
						||
| 
								 | 
							
								For that sort of thing, you're going to want to look at the configuration guide.
							 | 
						||
| 
								 | 
							
								This should be enough to get you going, though.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## How to Build and Run A Test File
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This is the single biggest challenge to picking up a new unit testing framework,
							 | 
						||
| 
								 | 
							
								at least in a language like C or C++. These languages are REALLY good at getting
							 | 
						||
| 
								 | 
							
								you "close to the metal" (why is the phrase metal? Wouldn't it be more accurate
							 | 
						||
| 
								 | 
							
								to say "close to the silicon"?). While this feature is usually a good thing, it
							 | 
						||
| 
								 | 
							
								can make testing more challenging.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You have two really good options for toolchains. Depending on where you're
							 | 
						||
| 
								 | 
							
								coming from, it might surprise you that neither of these options is running the
							 | 
						||
| 
								 | 
							
								unit tests on your hardware.
							 | 
						||
| 
								 | 
							
								There are many reasons for this, but here's a short version:
							 | 
						||
| 
								 | 
							
								- On hardware, you have too many constraints (processing power, memory, etc),
							 | 
						||
| 
								 | 
							
								- On hardware, you don't have complete control over all registers,
							 | 
						||
| 
								 | 
							
								- On hardware, unit testing is more challenging,
							 | 
						||
| 
								 | 
							
								- Unit testing isn't System testing. Keep them separate.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Instead of running your tests on your actual hardware, most developers choose to
							 | 
						||
| 
								 | 
							
								develop them as native applications (using gcc or MSVC for example) or as
							 | 
						||
| 
								 | 
							
								applications running on a simulator. Either is a good option. Native apps have
							 | 
						||
| 
								 | 
							
								the advantages of being faster and easier to set up. Simulator apps have the
							 | 
						||
| 
								 | 
							
								advantage of working with the same compiler as your target application. The
							 | 
						||
| 
								 | 
							
								options for configuring these are discussed in the configuration guide.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To get either to work, you might need to make a few changes to the file
							 | 
						||
| 
								 | 
							
								containing your register set (discussed later).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In either case, a test is built by linking unity, the test file, and the C
							 | 
						||
| 
								 | 
							
								file(s) being tested. These files create an executable which can be run as the
							 | 
						||
| 
								 | 
							
								test set for that module. Then, this process is repeated for the next test file.
							 | 
						||
| 
								 | 
							
								This flexibility of separating tests into individual executables allows us to
							 | 
						||
| 
								 | 
							
								much more thoroughly unit test our system and it keeps all the test code out of
							 | 
						||
| 
								 | 
							
								our final release!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*
							 |