Encapsulated unit testing logic
The most canonical way of accomplishing what you want is to use the testing framework's functionality for writing data-driven tests, rather than writing a common helper method and then a number of separate tests which pass arguments into it.

Different frameworks do this differently, so I will focus on MSTest first, as that is the framework you use.

In MSTest, there is a DataSource attribute you can supply, which defines how the framework can locate your test data.  Additionally, you supply a TestContext property of type TestContext.

When the tests execute, TestContext will be populated with the data for a single test case, and you can access it by using named indexing into the TestContext.DataRow property.

(Note: I haven't done MSTest in some time, so feel free chime in if there's a better way nowadays)

Example:
(Embedded resource: foo.xml)

&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;Tests&gt;
   &lt;Test&gt;
      &lt;a&gt;1&lt;/a&gt;
      &lt;b&gt;2&lt;/b&gt;
      &lt;result&gt;3&lt;result&gt;
   &lt;/Test&gt;
   &lt;Test&gt;
      &lt;a&gt;2&lt;/a&gt;
      &lt;b&gt;2&lt;/b&gt;
      &lt;result&gt;4&lt;result&gt;
   &lt;/Test&gt;
&lt;/Tests&gt;


(test file)

  public TestContext TestContext { get; set; }

  [TestMethod]
  [DeploymentItem ("foo.xml")]
  [DataSource ("Microsoft.VisualStudio.TestTools.DataSource.XML",
               "|DataDirectory|\\foo.xml",
               "Test",
               DataAccessMethod.Sequential)]
  public void TestAdd ()
  {
     var first = (int) TestContext.DataRow ["a"];
     var second = (int) TestContext.DataRow ["b"];
     var expected = (int) TestContext.DataRow ["result"];
     var result = testObject.Add(first,second);
     Assert.AreEqual(expected, result);
  }


Adding more test cases is just a matter of adding  elements with new data and re-building/re-running.

The How-To MSDN page can be found here, and some examples of DataSource configuration strings can be found here.

Just to give you a taste of this in other frameworks:

NUnit TestCase

  [TestCase(1,2,3)]
  [TestCase(2,2,4)]
  public void TestAdd(int first, int second, int expected)
  {
     var result = testObject.Add(first, second);
     Assert.That(result, Is.EqualTo(expected));
  }


NUnit TestCaseSource

  public static IEnumerable&lt;TestCaseData&gt; TestData
  {
     yield return new TestCaseData(1, 2, 3);
     yield return new TestCaseData(2, 2, 4);
  }

  [TestCaseSource("TestData")]
  public void TestAdd(int first, int second, int expected)
  {
     var result = testObject.Add(first, second);
     Assert.That(result, Is.EqualTo(expected));
  }


MbUnit Row

  [RowTest]
  [Row(1,2,3)]
  [Row(2,2,4)]
  public void TestAdd(int first, int second, int expected)
  {
     var result = testObject.Add(first, second);
     Assert.AreEqual(result, expected);
  }