Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Holding a Value in Unit tests

I have a Question for you guys.I have 2 unit tests which are calling webservices .The value that one unit-test returns should be used for another unit test method

Example

namespace TestProject1
{
    public class UnitTest1
    {
        String TID = string.empty;

        public void test1
        {
           //calling webservices and code

           Assert.AreNotEqual(HoID, hID);
           TID = hID;
        }

        public void test2
        {
           //calling webservices and code            
           string HID = TID  // I need the TID value from the Above testcase here

           Assert.AreNotEqual(HID, hID);            
        }
    }
}

How can i store a value in one unittest and use that value in another unittest.

like image 762
user1410658 Avatar asked Oct 24 '12 20:10

user1410658


People also ask

What makes a unit test valuable?

One of the benefits of unit tests is that they isolate a function, class or method and only test that piece of code. Higher quality individual components create overall system resiliency. Thus, the result is reliable code. Unit tests also change the nature of the debugging process.

What makes a unit test self validating?

Tests must be self-validating. This means each test must be able to determine if the actual output is according to the expected output. This determines if the test is passed or failed. There must be no manual interpretation of results.

What is the value of unit testing?

Unit testing ensures that all code meets quality standards before it's deployed. This ensures a reliable engineering environment where quality is paramount. Over the course of the product development life cycle, unit testing saves time and money, and helps developers write better code, more efficiently.


3 Answers

In general, you shouldn't write your tests like this. You cannot ensure that your tests will run in any particular order, so there's no nice way to do this.

Instead make the tests independent, but refactor the common part into it's own (non-test) method that you can call as part of your other test.

like image 159
Oleksi Avatar answered Oct 13 '22 18:10

Oleksi


Don't reuse any values. Order in which tests are run is very often random (most common runners like NUnit's and Resharper's run tests in random order, some might even do so in parallel). Instead, simply call web service again (even if that means having 2 web service calls) in your second test and retrieve the value you need.

Each test (whether it's unit or integration) should have all the data/dependencies available for it to run. You should never rely on other tests to setup environment/data as that's not what they're written for.

Think of your tests in isolation - each single test is a separate being, that sets up, executes, and cleans up all that is necessary to exercise particular scenario.

like image 26
k.m Avatar answered Oct 13 '22 17:10

k.m


Here's an example, following the outlines of Oleksi, of how you could organize this

String TID = string.empty;

[TestFixtureSetUp]
public void Given() {
  //calling webservices and code
  TID = hID;
  //calling webservices and code
}

[Test]
public void assertions_call_1() {
   ...
}

public void assertions_on_call_2() {
   if (string.IsNullOrEmpty(TID))
     Assert.Inconclusive("Prerequisites for test not met");
   ...
}
like image 2
flq Avatar answered Oct 13 '22 17:10

flq