An indispensable tool for anyone involved in developing, testing and managing .NET software products for Windows.
.net SmokeTest is a Windows application that provides an interactive interface into any .net Assembly allowing you to smoke-test an API without writing a single line of code. Construct an instance, call a method and get or set a property or field of any class then view or "drill-down" into the result.
SmokeTest also works in .NET Reflector as an Add-In
Download the latest version and "unzip" the contents into any location on your computers local drive. I would recommend "C:\SmokeTest 2.2" as the most convenient location.
The SmokeTest application is configured by default to target the .net 4.0 runtime. That means it can load Assemblies that target .net 1.1, 2.0, 3.x and 4.x. If you do not have .net 4.x installed on your machine you will need to edit the SmokeTest.exe.config file and remove the 4.0 configuration entry or rearrange the entries so that 2.0 is first-in-line as follows:
<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v2.0.50727" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
This is an early release of the product to get the idea out there and to "smoke-test" the functionality in the real world. I'd like to hear from you if you have any ideas for new and expanded features.
Below is a list of planned, pending and completed stories (features and improvements) for this product. Let me know your ideas for new features.
|Show Inherited Members Add an option to include inherited members in the member lists (Methods, Properties, etc.).||None|
|Multiple Thread Invoke Add the ability to invoke a member function on more than one thread by including an editable drop-list control to select the number of threads. Default should of course be 1 (invoke on just one thread) with pre-defined enumerations 1, 2, 5, 10 and 25.||None|
|Filtered Tree View Add a means to filter the tree view with keywords.||None|
|Filter Members by Attribute Add controls to filter the member lists (Methods, Properties, etc.) by attributes (public, private, internal, etc.).||None|
|Filter Member Lists Add the ability to filter member lists (Constructors, Methods, etc.) with keywords to visually reduce the number of items in the list.||None|
|Indexed Properties Add support for properties that accept any number of index pararameters.||None|
|Show Selected Member Info Display the full identity of the currently selected Type so that the namespace context is always visible.||None|
|Array Arguments Add the ability to input array arguments for all literal types (int, string, etc...) by inputing comma delimited values.||None|
|Support Generics Add the ability to invoke members of any generic class. Currently Generic classes are not displayed in the tree view.||None|
|Delete Object Pool Instances Add ability for user to delete objects from the object pool.||None|
|Assembly Domains User assemblies should be loaded into separate App Domains for flexibility (e.g. remove assemby) and stability. The current internal process Assemblies would be listed in an "Internal" tab and user added Assemblies in an "External" tab in the tree view.||None|
|Cosmetic Update New icons.||Released||22.214.171.124|
|Persist Window Size Application should persist the main Window size (width and height) between sessions.||Released||126.96.36.199|
|Support 4.0 Out-of-the-Box Application should support Assemblies that target .net 4.0 and 2.0 out-of-the-box w/o the need to modify the default configuration file. See the help page for information about modifying the configuration.||Released||188.8.131.52|
|Link to Help Include a menu item that links to the application's help page.||Released||184.108.40.206|
|Link to Blog Include a menu item that links to the application's blog.||Released||220.127.116.11|
|Deliver Default Config Files Deliver default app.config files with the installation in an effort to support most .NET versions out-of-the-box.||Released||18.104.22.168|
|Drag-n-Drop Add ability to load Assembly files via drag-n-drop onto the Assembly tree control.||Released||22.214.171.124|
|"External" Tab Add user loaded assemblies into a separate "External" tab in preparation for implementing Assembly Domains. This tab would behave the same as the current "Internal" tab with the exception that Assemblies can be removed.||Released||126.96.36.199|
|Internal Class Name Internal classes should display as their full "parent+inner" type name when identified in the application.||Released||188.8.131.52|
|Floating Number Format Floating point argument edit boxes (for types Double and Single) should be initialized to "0" instead of "0.0" to avoid input formatting exceptions in other locales.||Released||184.108.40.206|
|Validate Invocation Count Validate the invocation count input text field to be a number greater than zero. Any format or value errors should pop-up a message box.||Released||220.127.116.11|
|Separate Reflector Add-In Separate the Reflector Add-In product from the stand-alone SmokeTest product allowing the Add-In to evolve on its own without being tied to every release of the SmokeTest product.||Released||18.104.22.168|
|Defect The SmokeTest Add-In for .NET Reflector will not pop-up when you load an Assembly from outside the Reflector folder. A work-around is to copy your Assembly into the .NET Reflector folder and load it from there or use the stand-alone version of SmokeTest (SmokeTest.exe).||Fixed||22.214.171.124|
|Multiple Invoke Add a control to invoke an operation multiple times. The default would be once with pre-assigned enumerations of 10, 100, 1,000, 10,000, 100,000, and 1 Million. This feature would be helpful when testing API performance.||Released||126.96.36.199|
|Average Invoke Times Display the average of multiple invoke calls along side the current display. The first invoke will not contribute to the average to compensate for Just-In-Time compilation. Each subsequent invoke of the member function will include the average ticks and ms times.||Released||188.8.131.52|
|Add to Object Pool Replace the current automatic adding of instance results to the Object Pool with an explicit action by the user to add an instance. This way the user is in control of which objects are added and will help to reduce Object Pool bloat.||Released||184.108.40.206|
|Object Pool Preview Add a ToString preview to the Object Pool Tab that displays the selected item in the list. This will sometimes provide more information about the selected object when browsing the Object Pool.||Released||220.127.116.11|
|Interface Arguments Support interface argument types by providing a choice from a tree of Types that implement the interface or by selecting from the Object Pool.||Released||18.104.22.168|
|Object Pool Add the ability to choose arguments from a pool of object instances created during the current session. This allows you to use any object you create as an argument to other member functions. Very powerfull!||Released||22.214.171.124|
|Instance Form Loses Type Focus Defect: Form to create a new instance of a Type replaces original Type with your current selection when you switch Assemblies resulting in an empty Type tree.||Released||126.96.36.199|
|Preview Tabs Add a default ToString and Statistics Tab to the preview panel. This will allow much more performance related information to be displayed for each invocation like average invoke times and more w/o interfering with the default ToString output and addressing the current screen real-estate restrictions for the performance information.||Released||188.8.131.52|
|Support ValueType Include support for ValueType (struct) as a smoke-testable type. This adds many more types from the System library such as DateTime that are available for smoke-testing.||Released||184.108.40.206|
Deliver SmokeTestControl DLL
Deliver the smoketest functionality in a separate SmokeTestControl Assembly with the installation package. User's can then incorporate this control into their own applications if so desired.
Included the full x86 and x64 versions of all deliverables in the zip file as well as the 64-bit executable SmokeTest64.exe.
The .NET Reflector Add-In (SmokeTest.Reflector.AddIn.dll) has been modified to reference the new SmokeTestControl.dll instead of SmokeTest.exe.
The SmokeTest application (SmokeTest[32|64].exe) still runs stand-alone (independent of SmokeTestControl.dll).
|Choose from Derived Types Let the user choose from a tree of derived types when creating an instance of a reference Type argument. By default the tree will display all derived types from the current Assembly or, more specifically, the Assembly that contains the function-under-test. A drop-list is available to display the Type tree from any other loaded Assembly.||Released||220.127.116.11|
|Abstract Type Text Color Display abstract types in the tree control as "gray" text.||Released||18.104.22.168|
|Support .net 4.0 Assemblies Need to support smoke-testing .net 4.0 assemblies. The SmokeTest application targets the .net 2.0 runtime. Therefore, to support 4.0 assemblies, we need a .net configuration (SmokeTest.exe.config) that targets 4.0 runtime. This story adds the config file to the deliverables.||Released||22.214.171.124|
|Specify Assembly File on Command Line: Add the ability to specify an assembly file on the command line to be loaded at startup. The addition of this feature automatic enables drag-n-drop of assembly files onto the application icon.
The syntax for this feature is as follows:
Where path is the absolute or relative path name of an existing Assembly DLL or EXE file.
|Defect: Re-loading the same assembly file creates another node in the Assembly tree. It should replace the existing node with the current Assembly.||Fixed||126.96.36.199|
|.NET Reflector Support: Fixed a defect that would not support smoke-testing of Types in some assemblies (e.g. System.dll).||Released||188.8.131.52|
|.NET Reflector Add-In Create a .NET Reflector Add-In DLL that will allow you to smoketest any supported Type from inside Reflector's Assembly browser.||Released||184.108.40.206|
|Include Types from the "null" Namespace Include types from the global and null namespace in the Supported Types. This is necessary so that static types such as System.Console are included in the listing.||Released||220.127.116.11|
|Include Abstract Types: Include abstract class types so that any static members can be smoke tested.||Released||18.104.22.168|
|Application Icon: The smoketest application needs an Icon. I thought a smoke alarm would work nicely.||Released||22.214.171.124|
Target Any CPU Platform: Modify the SmokeTest application (SmokeTest.exe) so that under 32 or 64 bit Windows you can smoke-test Assemblies built for "Any" platform. Also, include a new SmokeTest32.exe application to smoke-test "x86" Assemblies under 64-bit Windows. Here is a table that lists the Assembly types that can be loaded by each build of the SmokeTest application when run under Win 32 and Win 64.
|Create any Reference Type Argument: Add the ability for the user to create an instance of any reference type as an argument to a member function.||Released||126.96.36.199|
|Edit Reference Type Arguments: Add the ability to edit an instance of a Reference Type argument offering you more control over the arguments passed to functions.||Released||188.8.131.52|
|Initialize Argument Input: Initialize literal argument input fields with their corresponding default values (0 for int, 0.0 for double, etc.). This avoids annoying exceptions when invoking a function with the default arguments.||Released||2.1.2012.0|
|Create default Reference type Arguments: Automatically create instances of Reference type arguments by calling their default constructor, if available. This feature will let you invoke methods on class members with default instances of concrete class arguments instead of just a null value.||Released||2.1.2011.1|
|Replace "null" Button with Check Box: Replace the current button used to indicate a null argument with a more intuitive check box where Unchecked means pass a null value for the argument and Checked means use the argument value specified.||Released||2.1.2011.0|
|Persist Member Tab State: Each member Tab (Contructors, Methods, etc) should have it's own set of specialized controls for persistency when switching between tabs.||Released||2.0.4222.27899|
|Show Time to Invoke an Operation: Display the time it took to invoke an operation (constructor, method, property, etc.). This can be helpful when determining API performance.||Released||2.0.4214.11876|
|Proof of Concept Prove that the concept has value by implementing the minimum interface necessary to be able to interactively invoke members of any managed class from any .net 2.0, 3.0 and 3.5 Assembly.||Released||2.0.4202.19010|