NI TestStand Idea Exchange

Community Browser
Showing results for 
Search instead for 
Did you mean: 
Post an idea

I think it can a be a really good idea to review and give feedback on all Idea exchange.


You ask us to give feedback but you don't finish the loop.


Some idea are mark as new for many years now...



Looking at any step result, there's a TS.StartTime property, but it's referenced against the "the number of seconds since the application initialized the TestStand Engine"


What this means is that each step result is referenced against a somewhat arbitrary and changing epoch that isn't recognizable outside any one instance of the TestStand application, let alone by external applications.


I'd like to propose adding TS.StartTimeUnix, which contains the absolute time the step started.

I've added this in our model customization plugins, but to convert the epoch to UNIX I have to perform this calculation:


Seconds(False)-Seconds(True) + Parameters.Result->TS.StartTime


Why I'm asking for this:

In our step result database table, we've added a column for STEP_START_DATE_TIME which is absolute UTC time. To populate this I have to go through the gymnastics above. I revisited this code today and thought, "What silliness. This should be something natively supported." (Other than that I have no strong opinion on the matter)

When monitoring values within a loop in TestStand, it is often desired to only record step failure results.  It would be useful to have a "Result Recording Option" of "Enabled On Step Failure":


TestStand Idea Exchange - Enable Result Recording On Step Failure.png


This is possible through various means (SequenceFilePostResultListEntry callbacks and other custom code).  However, I believe this would simplify TestStand sequence development significantly.

How many times have you found yourself typing double backslashes "C:\\Windows\\System32\\cmd.exe" or even worse, going through a copied path to change every backslash to a double backslash (and inevitably missing one), just so you can pass a file or directory as a constant to a code module or another sequence?


string issue.png


I'd like to see a symbol for 'explicit string' in the TestStand expression language, much like C# does with the @ symbol.

So if we typed @"C:\windows\temp" we would actually get the string "C:\Windows\temp" instead of "C:\Windows<tab>emp".


To really go the extra mile on this:

  • Drag and drop could be enabled, so that any file dragged from another window into an expression box would automatically paste the filename.
  • A browse button could be added to the expression browse dialog which would bring up the usual file open dialog and insert the selected filename.
Message Edited by Josh W on 06-14-2010 12:57 PM
Message Edited by Josh W on 06-14-2010 12:58 PM

The Search Directories.Insert method should only insert the directory if it is not already there.


The Method includes an index argument, if the directory is already there, then it should move the existing directory to the requested index.


While we were working on the shipping examples for DQMH, we discovered that the insert method was creating duplicates every time it was called. We implemented a work around that includes a for loop to check each of the items in the search directories list to see if it is the directory we are trying to insert, if it is, we delete it. Once the for loop ends, then we insert the directory where we want it.


You can see a video of the issue and how we worked around it here: DQMH 3.1 Only inserts the Delacor examples directory into Search Directories once

When opening a version of TestStand which is not the current version, an error dialog shows. It would be helpful if this dialog included a button to open the version selector and/or a button to open the active version.




I've found that there's a hole in the global map in TestStand - often there's something that I want to access across a project or workspace instance, but not a station (this is especially true when developing on my laptop).  I know that there are work arounds for this issue, but none of them are elegant solutions IMHO.  I'd like to see workspace and/or project globals implemented.

When loading large sequence files, TestStand does not display progress and appears to "lock up" both TestStand and the LabVIEW OI.  Sequences with hundreds of steps can take minutes to load.  Operators often incorrectly conclude the application has stopped respoding during long pre-loads.


I am suggesting to implement a responsive progress display, allowing the LabVIEW OI to proceed execution, and post the following UI Messages during step pre-load.



  1. UIMsg_ProgressPercent–(Value: 11) TestStand step modules post this message to the user interface to notify it to update its progress indicator associated with an execution.
  2. UIMsg_ProgressText–(Value: 12) TestStand step modules post this message to the user interface to notify it to update its progress message associated with an execution.



I would like to ask to add named types support for TestStand array literals. The current behavior is described as follows:


Declares a one-dimensional array of numbers, strings, Boolean values, object references, or containers. If all elements are of the same type, the result array is an array of elements of that type. If all elements are not of the same type, the result array is an array of containers.

I would like it to be more or less like this:

Declares a one-dimensional array of numbers, strings, Boolean values, object references, containers, or named type. If all elements are of the same type, the result array is an array of elements of that type. If all elements are not of the same type, the result array is an array of containers.

The problem with the current implementation can be seen on the screen.



It is not a bug (BUG 1828580 to be more precise), it is a feature.

Currently, there is no unambiguous solution for passing empty Array of X (where X is a different type than 64-bit Floating Point) as a sequence parameter. If we use {} it is assumed to be of type 64-bit Floating Point. To have an empty Array of Strings we can use ambigues Split("",""). I have no idea how to pass e.g. empty Array of Signed 64-bit Integer without creating empty variables.


It would useful to have Empty Array Literals of a particular type e.g.:

{} - default

{}i64 - for Signed 64-bit Integer

{}ui64 - for Unsigned 64-bit Integer

{}s - for String

{}b - for Boolean

{}r - for Object Reference

{}c - for Container

{}TYPE_NAME - for type definition where TYPE_NAME is type definition name; e.g. Path.


Because of the way .NET applications and assemblies are invoked in TestStand they are a child process of TestStand.  This means that they share TestStand's resources.  For most applications this is not an issue but if the application or library being instrumented by TestStand is resource intensive this creates a significant problem.  In the scenario that served as the impetus for this suggestion we saw performance 1/10 that when running the target application outside of TestStand.


To correct this I recommend the .NET adapter architecture be changed or be able to be configured such that instead of directly instantiating target applications a call to create an object with a .NET adapter would create a separate process that consisted of a TestStand WCF client wrapper process that would host the target .NET process and communicate with the parent TestStand instance via WCF.


Here is a simple block diagram of the intended architecture:






It would be nice to make Sequences public or private within a SequnenceFile.

With this you where able to make powerful SequenceFiles librarys.  The biggest advantage of this

is you can show the consumer of the library only the "important" public sequences. The

private ones where invisible. This will help to avoid errors.






currently the behavior of the date function is (1) get a short ("MM/DD/YYYY") or long form date string ("Weekday, Month D, YYYY")with nice easy boolean input, (2) pass it N local variables to get all the discrete parts and assemble it myself with a bit of STR() and concatenation.


could we create a permutation on this date() function, (does one already exist) so that I can just pass it a %<> syntax string and have it format the current date to my desired format?


specifically, I'm looking for a non painful way of building a "YYYY-MM-DD" style string for a report (or even just DD/MM/YYY) without having to lug around 8 locals and a lengthly expression, or call into a LV VI. 


We have basic string format symbols available for the STR and VAL functions, why not for date? if anything passing this 1 parameter might save alot of folks creating a bunch of locals because they can just ask for the time item they want directly, and then VAL() the output text to get the numeric data if they need it?


it'd be awesome if the function supported standard DB format tags such as ( or failing that, was consistent with what LabVIEW's time format strings were.


Just a thought. Has anyone worked around this in a reasonable way?


--Elaine R.

Currently, the only way to pass parameters from a subsequence to a caller is by reference.  It would be nice if you could also pass parameters to callers by value to prevent the callers from modifying them.

The concept of TestStand Environments was introduced in TestStand 2016 and allows you to define multiple configurations on a single test station or development PC. It would be nice if there was an option to link a sequence file to a specific environment, similar to how you can set a sequence file to "Require Specific Model" In the Advanced tab of the Sequence File Properties. When a sequence file is loaded, the engine could check to see if the required environment matches the current environment and:

  • Automatically relaunch the app in the correct environment
  • Generate an error
  • Prompt the user for an action
  • Other??

It would be nice to choose the behavior when a required environment doesn't match.


If anyone has other thoughts or use cases, please share below.


When I get called to look at an issue that has occurred with a test, the account logged into TestStand is typically a restricted user (i.e. Operator). Since the Operator account has very limited options, in order to really do much immediate troubleshooting I need to stop the test and re-run it in the Administrator account. At best this is inconvenient and inefficient if the spot the error occurred is late in the test. However, it is extremely frustrating when it's an intermittent run-time error and I can't do any real-time debug because Operator is logged in. The only real alternative I can think of (when the problem is intermittent) is to leave it logged in as Administrator so I can debug whenever it happens to occur. This is not really an acceptable practice in most cases.


It would be fantastic if there were an override that let's an Administrator provide the proper credentials to perform the desired task that would normally be off-limits to the Operator. The basic premise of this suggestion is similar to the functionality within Windows; if you try to connect to a secured location or perform a task that requires administrator privileges, a dialog box pops up asking you to enter authorized credentials.


I run into many situations where I wish this feature was present. The issue is not always within TestStand (could be a database connection issue, etc.), but it is TestStand that throws the error and in Operator mode the only option is "Run Cleanup". Significant time, effort, frustration, and efficiency could be saved if I could simply enter my credentials as an administrator to perform the tasks I need to do.





On an unrelated side note, I find it humorous that "TestStand" is considered a misspelled word when using the forum spell checker.  🙂

Let's say I'm building a fairly long compound expression that has some repeated parameters - I would like a way to specify (without creating additional locals) a variable/macro for use just within that expression.


For example, instead of:

Locals.CommandLine = "cmd /c C:\some path\that\is\reused"
Locals.CommandLine += " /path C:\some path\that\is\reused"



I could specify:

#pathmacro "C:\some path\that\is\reused"
Locals.CommandLine = "cmd /c " + pathmacro
Locals.CommandLine += " /path " + pathmacro



The idea being that with this I only need to update the macros in one place in a long expression.


This is a simple example, but hopefully you can see why this would be useful and why I wouldn't want to create lots of locals when the values are required only within the expression.

I'd like to be able to specify the username, password, and local & remote paths by expression:



Since our projects involve several developers working in tandem, we manage all project relevant data under SCM (Source Code Management). This way sharing and exchange of data between developers is much easier. To ensure that all developers can access and use the same TestStand Components – especially the language directory – the TestStand configuration directory is also under SCM control.

During the development process if a developer checks out the project folder, for example to „C:\ProjectX“, then the language folder is available under „C:\ProjectX\TestStand\Components\Language“.


TestStand ProjectX.jpg


In Teststand there is an option to point the configuration directory to a custom directory. To do this, go under the Station Options – Preferences – Configuration Directory,  and change the default path to our custom checkout path.


Station Options.png


However, even changing this setting, the language files are still get loaded from the default configuration path. In other words, assigning new custom path (which is „C:\ProjectX\TestStand\Components\Language“) seems to have no effect and the older default location (which is „C:\Users\Public\Documents\National Instruments\TestStand“) keeps getting selected instead.

This means, every developer has to copy the ProjectX TestStand folder into the default location manually a SCM update.


Suggested solution: make the whole default location directory changeable, to point to a custom directory. Thus during development of different projects, it is much easier to switch between the projects and to have the possibility to check out the code from a SCM to only one directory (and continue working with them).