|
|
(14 intermediate revisions by 4 users not shown) |
Line 1: |
Line 1: |
| ==Introduction== | | ==Introduction== |
| The Test Double Sample is part of the [[Test_Unit_Samples|STRIDE Test Unit Samples]].
| |
|
| |
|
| == Building and Running the Samples ==
| | This example using a '''C++ test class''' cover the application of test doubles. Please read the [[Using Test Doubles]] article before proceeding in order to understand the concepts. You may also find it helpful to review the information available [http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html here] for more details on test double terminology. |
| Please refer to the section appropriate for your target build environment: | |
|
| |
|
| *[[Building and Running Test Unit Samples Under Windows| Windows Off-Target]]
| | ==Tests Description== |
|
| |
|
| *[[Building and Running Test Unit Samples Under Linux|Linux]]
| | ===TestFunction=== |
|
| |
|
| *[[Building and Running Test Unit Samples Under WinMobile|WinMobile]]
| | This case validates <tt>test_func1</tt> function (implemented in <tt>s2_testdouble_function.h/c</tt>) which in turn depends on <tt>depend1</tt> function (in <tt>s2_testdouble_depend.h/c</tt>). Since the caller (<tt>test_func1</tt>) and the callee (<tt>depend1</tt>) are in separate compilation units the depencency is captured for interception (via [[Using Test Doubles#Configuring_the_Double_Using_SCL|scl_function]] pragma in <tt>s2_testdouble_function_test.h/c</tt>) using ''"DEFINITION"'' and ''"IMPLICIT"'' options. |
|
| |
|
| ==Test Double Sample==
| | ;CallNoDoubling |
| | : Simple case to demonstrate operation where no doubling is used. The true <tt>depend1</tt> is used when testing <tt>test_func1</tt>. |
|
| |
|
| Once you have built the sample target application and executed its tests, you can take time to peruse the test double source and the corresponding results that each produces. This section provides a brief description for each. <br>'''''Note:''''' It is recommended that you read the [[Using Test Doubles]] article before proceeding in order to understand the concepts.
| | ;CallWithFake |
| | : Dynamically replaces dependency <tt>depend1</tt> with a fake <tt>fake_depend_1</tt> function, which simply returns a constant. |
|
| |
|
| ===01_01_Cpp_Test_Function===
| | ;CallWithMock |
| | : Dynamically replaces dependency <tt>depend1</tt> with a mock <tt>mock_depend_1</tt> function, which validates the passed in parameter and proceeds as the original <tt>depend1</tt>. |
|
| |
|
| This example uses a '''C++ test class''' to validate the '''test_func1''' function under test. The dependency '''depend1''' is left in place during the '''CallNoDoubling''' method. The dependency is replaced with a fake method, which simply returns a constant in the '''CallWithFake''' method. The dependency is replaced with a mock method, which validates the passed in parameter, in the '''CallWithMock''' method.<br> | | ===TestFunctionWithDepend=== |
| The intercept mangling parameters in this example, in the [[Function_Double#Configuring_the_Double_Using_SCL|scl_function pragma]], uses the '''"DEFINITION"''' option to indicate the the intercept will be at the function definition, and the'''"IMPLICIT"''' option because no mangling is required to intercept (because the caller and callee are in separate compilation units).
| | This case, similar to [[#Basic::TestFunction|Basic::TestFunction]], validates <tt>test_func2</tt> function which in turn depends on <tt>depend2</tt> function. It differs in that the implementation is done in the same source file (both implemented in <tt>s2_testdouble_function_with_depend.h/c</tt>). Since the caller (<tt>test_func2</tt>) and the callee (<tt>depend2</tt>) are in the same compilation unit the depencency is captured for interception (via [[Using Test Doubles#Configuring_the_Double_Using_SCL|scl_function]] pragma in <tt>s2_testdouble_function_with_depend_test.h</tt>) using ''"REFERENCE"'' and ''"EXPLICIT"'' options. |
|
| |
|
| ===01_02_Cpp_Test_Function_With_Depend===
| | ;CallNoDoubling |
| This example uses a '''C++ test class''' to validate the '''test_func2''' function under test. The dependency '''depend2''' is left in place during the '''CallNoDoubling''' method. The dependency is replaced with a fake method, which simply returns a constant in the '''CallWithFake''' method. The dependency is replaced with a mock method, which validates the passed in parameter, in the '''CallWithMock''' method.<br>
| | : Simple case to demonstrate operation where no doubling is used. The true <tt>depend2</tt> is used when testing <tt>test_func2</tt>. |
| The intercept mangling parameters in this example, in the [[Function_Double#Configuring_the_Double_Using_SCL|scl_function pragma]], uses the '''"REFERENCE"''' option to indicate the the intercept will be at the function call, and the'''"EXPLICIT"''' option because mangling is required to intercept (because the caller and callee reside in the same source file).
| |
|
| |
|
| ===02_01_C_Test_Function===
| | ;CallWithFake |
| This example uses a '''C test class''' to validate the '''test_func1''' function under test. The dependency '''depend1''' is left in place during the '''CallNoDoubling''' method. The dependency is replaced with a fake method, which simply returns a constant in the '''CallWithFake''' method. The dependency is replaced with a mock method, which validates the passed in parameter, in the '''CallWithMock''' method.<br>
| | : Dynamically replaces dependency <tt>depend2</tt> with a fake <tt>fake_depend_2</tt> function, which simply returns a constant. |
| The intercept mangling parameters in this example, in the [[Function_Double#Configuring_the_Double_Using_SCL|scl_function pragma]], uses the '''"DEFINITION"''' option to indicate the the intercept will be at the function definition, and the'''"IMPLICIT"''' option because no mangling is required to intercept (because the caller and callee are in separate compilation units).
| |
|
| |
|
| ===02_02_C_Test_Function_With_Depend===
| | ;CallWithMock |
| This example uses a '''C test class''' to validate the '''test_func2''' function under test. The dependency '''depend2''' is left in place during the '''CallNoDoubling''' method. The dependency is replaced with a fake method, which simply returns a constant in the '''CallWithFake''' method. The dependency is replaced with a mock method, which validates the passed in parameter, in the '''CallWithMock''' method.<br>
| | : Dynamically replaces dependency <tt>depend2</tt> with a mock <tt>mock_depend_2</tt> function, which validates the passed in parameter and proceeds as the original <tt>depend2</tt>. |
| The intercept mangling parameters in this example, in the [[Function_Double#Configuring_the_Double_Using_SCL|scl_function pragma]], uses the '''"REFERENCE"''' option to indicate the the intercept will be at the function call, and the'''"EXPLICIT"''' option because mangling is required to intercept (because the caller and callee reside in the same source file).
| |
| | |
| ===Command Line Execution===
| |
| | |
| Command line execution for the Test Double sample is done using the [[Test_Runners#TestUnitRun.pl|TestUnitRun utility]]. Here are several examples of specific syntax to execute the sample. All of these commands can be invoked from a standard [http://en.wikipedia.org/wiki/Command_Prompt_(Windows) command shell] (or other shell of your choosing) and the arguments shown assume that the commands are executed with the sample's directory as the starting directory. You must have your TestDouble.exe application running in order for the runner to be able to initiate a connection to the target simulator. In addition, you should verify that your %STRIDE_DIR%\bin\transport.cfg file is using the TCP transport to connect to port 8000 (these are the default settings when the product is installed).
| |
| | |
| ====Simple execution of all test units====
| |
| | |
| The following command executes all of the test units found in the STRIDE database you have previously generated. For the purpose of this sample, since there is only one database, the -d parameter is not strictly needed, but it is shown here for completeness.
| |
| | |
| TestUnitRun.pl -d TestDouble.sidb
| |
| | |
| This command executes all Test Units found in the database in descending alpha-numeric sort order. Any Test Unit initialization arguments are given default values (typically zero or NULL).
| |
| | |
| When you run this command, you should see console output like:
| |
| | |
| Attempting connection using [Sockets (S2)] transport ...
| |
| Connected to device.
| |
| Initializing STRIDE database objects...
| |
| Done.
| |
| Running Test C_Test_Function...
| |
| Running Test C_Test_Function_With_Depend...
| |
| Running Test CppTestFunction...
| |
| Running Test CppTestFunctionWithDepend...
| |
| Disconnected from device.
| |
| Test Results saved to C:\STRIDE\Samples\TestUnits\TestDouble\TestDouble.xml
| |
| Test Report saved to C:\STRIDE\Samples\TestUnits\TestDouble\TestDouble.html
| |
| ***************************************************************************
| |
| Results Summary
| |
| ***************************************************************************
| |
| Passed: 12
| |
| Failed: 0
| |
| In Progress: 0
| |
| Not Applicable: 0
| |
| ...in 4 suites.
| |
| ***************************************************************************
| |
| | |
| ===Workspace-based Execution===
| |
| | |
| TestDouble.ssw, a workspace in the TestDouble directory, demonstrates the use of script execution with Studio to manage test order and hierarchy. This workspace was created using [[WorkspaceSetup.pl]]. The setup and teardown folders provide basic infrastructure scripts that start/stop the simulator application (TestDouble.exe) and to manage traceviews used for [[Runtime_Reference#Logging_Services|srPrint]] message collection. The scripts that drive the testing are in the workspace '''test''' folder. What follows is a brief description for each.
| |
| | |
| ====RunAll====
| |
| | |
| This folder contains a script, All.js, that iterates through the entire collection of test units and executes them one at a time. The order of execution will be in ascending alphabetical order (by name) since the [[AutoScript#ascript.TestUnits|ArrangeBy]] collection method was called.
| |
| | |
| ====Run Individual====
| |
| | |
| This folder shows how to use individual scripts to execute test classes. Each script has the following form:
| |
| | |
| ascript.TestUnits.Item('''TEST_UNIT_NAME''').Run();
| |
| | |
| The '''TEST_UNIT_NAME''' is the name of the test unit to be run. The order and hierarchy of each script may be changed via the Studio tree control by moving the script within the '''Run Individual''' folder.
| |
|
| |
|
| [[Category: Samples]] | | [[Category: Samples]] |