单元测试重复问题

unit test repetition issue

测试在这里,它们非常重复,我想改变......

     [TestClass]
    public class CompareDataTest
    {
private void GenerateTerms(int firstTerm, int secondTerm, out TaughtUnit firstGrade, out TaughtUnit secondGrade)
        {
            firstGrade = new TaughtUnit("foo");
            secondGrade = new TaughtUnit("bar");
        }

        [TestMethod]
        public void CompareResultsTest1()
        {
            var firstGrade = new TaughtUnit("foo");
            firstGrade.Percentage.Add("GRADE", 38);
            var secondGrade = new TaughtUnit("foo");
            secondGrade.Percentage.Add("GRADE", 70);
            var oldTerm = new List<TaughtUnit>() { firstGrade };
            var newTerm = new List<TaughtUnit>() { secondGrade };
            var rankBefore = firstGrade.Percentage;
            var rankNow = secondGrade.Percentage;
            var messages = Program.CompareData(oldTerm, newTerm);

            Assert.AreEqual(0, messages.Count);
        }

        [TestMethod]
        public void CompareResultsTest2()
        {
            var firstGrade = new TaughtUnit("foo");
            firstGrade.Percentage.Add("GRADE", 0);
            var secondGrade = new TaughtUnit("foo");
            secondGrade.Percentage.Add("GRADE", 35);
            var oldTerm = new List<TaughtUnit>() { firstGrade };
            var newTerm = new List<TaughtUnit>() { secondGrade };
            var rankBefore = firstGrade.Percentage;
            var rankNow = secondGrade.Percentage;
            int gradeOld = 0; int gradeNew = 10;
            var getGradeOld = firstGrade.Percentage.TryGetValue("GRADE", out gradeOld);
            var getGradeNew = secondGrade.Percentage.TryGetValue("GRADE", out gradeNew);
            var difference = gradeNew - gradeOld;

            var messages = Program.CompareData(oldTerm, newTerm);

            Assert.AreEqual(1, messages.Count);
            Assert.AreEqual("foo: GRADE rank has dropped by 30", messages[0]);
        }

我想我应该在测试集之前使用 private void,但我不知道如何... 我如何引用private void中创建的内容?

在测试 class 级别声明那些变量。使用私有方法填充设置变量。

 [TestClass]
public class CompareDataTest
{
    private TaughtUnit firstGrade;
    private TaughtUnit secondGrade;

    private void GenerateTerms(int firstTerm, int secondTerm, out TaughtUnit firstGrade, out TaughtUnit secondGrade)
    {
        firstGrade = new TaughtUnit("foo");
        secondGrade = new TaughtUnit("bar");
    }
    [TestMethod]
    public void CompareResultsTest1()
    {
        GenerateTerms(..., ..., ..)
        firstGrade.Percentage.Add("GRADE", 38);
        secondGrade.Percentage.Add("GRADE", 70);

        // rest of other things you want to set specific to the test.

        Assert.AreEqual(0, messages.Count);
    }
}

NUnit Framework 有多种方法可以为您的测试传递值源。

例如,我可以像这样测试 Guid.Parse

public static Dictionary<int, string> Datas
    {
        get
        {
            return Enumerable.Range(0, 100) //Lots of numbers
                             .ToDictionary(x => x, x => Guid.NewGuid().ToString());
        }
    }

    [Test]
    public void MultiCacheTest([ValueSource("Datas")] KeyValuePair<int, string> item)
    {                       
        //ACT ...Yes this tests Guid.Parse 100 times
        var value = Guid.Parse(item.value);

        Assert.AreEqual(item.Value, value.ToString());           
    }

我们的想法是传递测试您的 unit 可能采用的所有不同路径所需的所有 purmutations,并允许对的键作为方法的输入值,该对的值为预期结果。在您的情况下,您可能会传入 2 个百分比值,因为键 "0|35""foo: GRADE rank has dropped by 30" 将是预期值。