# Test steps OUTPUT -\> INPUT binding

**URL:** <https://forum.opentap.io/t/test-steps-output-input-binding/2602>\
**Category:** Ecosystem\
**Created:** [December 28, 2025, 8:54am UTC](https://forum.opentap.io/t/test-steps-output-input-binding/2602 "2025-12-28T08:54:07Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![t\_marius](https://avatars.discourse-cdn.com/v4/letter/t/59ef9b/32.png) [@t\_marius](https://forum.opentap.io/u/t_marius)\
**Post date:** [December 28, 2025, 8:54am UTC](https://forum.opentap.io/t/test-steps-output-input-binding/2602/1 "2025-12-28T08:54:07Z")

</div>

Hello,

I need the community help understanding how to bind an output from one step to an input of another step (I have experience with LabVIEW, but I’m new to OpenTAP and C#). I would like to know how to create this binding programmatically in a C# console application, not with TestStepAutomation, since we plan to develop our own custom UI later.

Below are two steps between which I’m trying to transfer data:

using OpenTap;

namespace openTapHelloWorld  
{  
[Display(“Measure MyDAQ Voltage”, Group: “openTapHelloWorld”)]  
public class MeasureMyDAQStep : TestStep  
{

public MyDAQ MyDAQ { get; set; }  
public MyDut Dut { get; set; }

```csharp
    [Output]
    [Unit("V")]
    public double Voltage { get; private set; }

    public override void Run()
    {
        Voltage = MyDAQ.MeasureVoltage();
        Results.Publish(Voltage);
        Log.Info("Measured voltage: {0:F3} V", Voltage);
    }
}

```

}

using OpenTap;

namespace openTapHelloWorld  
{  
[Display(“Check Voltage Limits”, Group: “openTapHelloWorld”)]  
public class CheckVoltageLimitsStep : TestStep  
{  
public double LowLimit { get; set; } = 0.0;  
public double HighLimit { get; set; } = 5.0;

```csharp
    public Input<double> Voltage { get; set; } = new Input<double>();

    public override void Run()
    {
        double v = Voltage.Value;

        Log.Info("Checking voltage {0:F3} V", v);

        if (v < LowLimit || v > HighLimit)
            UpgradeVerdict(Verdict.Fail);
        else
            UpgradeVerdict(Verdict.Pass);
    }
}

```

}

The console output complains that” _Step input requires reference to a TestStep”_

40] [TestPlan] PrePlanRun Methods completed [2.36 ms]

[30] [MyDAQ] myDAQ opened on myDAQ1/ai0

[30] [MyDAQ] Resource “MyDAQ” opened. [197 ms]

[30] [TestPlan] “Measure MyDAQ Voltage” started.

[30] [TestStep] Measured voltage: 0.051 V

[30] [TestPlan] “Measure MyDAQ Voltage” completed. [213 ms]

[30] [TestPlan] “Check Voltage Limits” started.

[10] [TestPlan] Error running “Check Voltage Limits”: Step input requires reference to a TestStep output..

[40] [TestPlan] Exception: **Step input requires reference to a TestStep output**.

[40] [TestPlan] at OpenTap.Input`1.get_Value() `

[40] [TestPlan] at openTapHelloWorld.TestSteps.CheckVoltageLimitsStep.Run()

[40] [TestPlan] at OpenTap.TestStepExtensions.DoRun(ITestStep Step, TestPlanRun planRun, TestRun parentRun, IEnumerable`1 attachedParameters)`

Thank you.

---

<div class="post-metadata">

**Author:** ![rolf\_madsen](https://avatars.discourse-cdn.com/v4/letter/r/43a26b/32.png) [@rolf\_madsen](https://forum.opentap.io/u/rolf_madsen)\
**Post date:** [January 4, 2026, 8:57pm UTC](https://forum.opentap.io/t/test-steps-output-input-binding/2602/2 "2026-01-04T20:57:56Z")

</div>

hi @t_marius and welcome to the forum.

For the Input class, you need to set the Step and Property which are properties on the Input object.

You can also connect properties not of a type deriving from Input by using the InputOutputRelation class.

---

<div class="post-metadata">

**Author:** ![t\_marius](https://avatars.discourse-cdn.com/v4/letter/t/59ef9b/32.png) [@t\_marius](https://forum.opentap.io/u/t_marius)\
**Post date:** [January 5, 2026, 8:03pm UTC](https://forum.opentap.io/t/test-steps-output-input-binding/2602/3 "2026-01-05T20:03:23Z")

</div>

Thank you @rolf_madsen, your suggestion worked.  
The only issue I ran into was a compiler error when setting the `Input` property. The compiler was trying to convert a `double` into an `IMemberData`, which caused the error. The solution you posted in another thread on the forum, to use TypeData.GetTypeData(_Step_).GetMember(“_StepMember_”) fixed it.

After setting both the source step instance and the output property, everything worked as expected.

 ![image](https://us1.discourse-cdn.com/flex020/uploads/opentap/original/2X/3/3dbe8155fb97cce3f6358c088489041c99b8ee1c.png)

Thanks!
