当前位置: 首页 > 知识库问答 >
问题:

奇数Xunit测试

厉熠彤
2023-03-14

我正在努力提高我的单元测试技能,我想知道是否有人能告诉我编写测试的最佳方法,以编写“给定整数数组的排序奇数”的测试。 目前,我正在用params将数据传递到测试中,但我也要验证输出是否正确。

    [Theory]
    [InlineData(1,2,3,4)]
    public void SortArrayOddNumber(params int[] number)
    {
        var s = number.Where(n => (n % 2) == 0).OrderBy(n=>n);
    }

共有3个答案

阎功
2023-03-14

你并不是真的在写单元测试。 您在测试中编写了一些代码,并希望对其进行验证。 通常情况下,您在其他地方会有一个方法,您正在尝试验证该方法。 让我们假设你有:

public static Numbers
{
   public static IEnumerable<int> FilterAndSortOdds(IEnumerable<int> source) 
       => source.Where(i => (i%2) != 0).OrderBy(i => i);
}

然后验证从测试中调用该方法。 例如,简单的fact可能如下所示:

public class TestClass
{

    [Fact]
    public void CanSortAndFilterOddNumbers() 
    { 
       var source = new[] { 1, 2, 9, 4, 5 };
       var expected = new[] { 1, 5, 9 };
    
       var actual = Numbers.FilterAndSortOdds(source).ToArray();
       Assert.Equal(expected, actual);
    } 

}

如果你想把这个转化为一个理论,你有几个选择。 您可以使用inlineData(通过创建新数组

public class TestClass
{
    [Theory]
    [InlineData(new[] { 1, 2, 9, 4, 5 }, new[] { 1, 5, 9 })] 
    [InlineData(new[] { 2, 1 }, new[] { 1 })] 
    [InlineData(new[] { 9, 7, 5, 3, 1 }, new[] { 1, 3, 5, 7, 9 })] 
    public void CanSortAndFilterOddNumbers(int[] source, int[] expected) 
    { 
       var actual = Numbers.FilterAndSortOdds(source).ToArray();
       Assert.Equal(expected, actual);
    } 

您还可以使用MemberData:

public class TestClass
{
    [Theory]
    [MemberData(nameof(PassingData)] 
    public void CanSortAndFilterOddNumbers(int[] source, int[] expected) 
    { 
       var actual = Numbers.FilterAndSortOdds(source).ToArray();
       Assert.Equal(expected, actual);
    } 

    public static IEnumerable<object[]> PassingData => new List<object[]> {
         /* Test 1 */
         new object[] { new[] { 1, 2, 9, 4, 5 }, new[] { 1, 5, 9 } }, 
        /* Test 2 */
         new object[] { new[] { 2, 1 }, new[] { 1 } }, 
        /* Test 3 */
         new object[] { new[] { 9, 7, 5, 3, 1 }, new[] { 1, 3, 5, 7, 9 } }
   };
}

对于类型更强一点的内容,我们可以使用classdatatheorydata助手:

public class TestClass
{
    [Theory]
    [ClassData(nameof(PassingOdds)] 
    public void CanSortAndFilterOddNumbers(IEnumerable<int> source, int[] expected) 
    { 
       var actual = Numbers.FilterAndSortOdds(source).ToArray();
       Assert.Equal(expected, actual);
    } 
}

public class PassingOdds : 
    TheoryData</*arg1*/IEnumerable<int>, /*arg2*/int[]>
{
    public PassingOdds()
    {
         /* Test 1*/
         Add(new[] { 1, 2, 9, 4, 5 }, new[] { 1, 5, 9 });
         /* Test 2 */
         Add(new List<int> { 2, 1 }, new[] { 1 });
         /* Test 3 */
         Add(new[] { 9, 7, 5, 3, 1 }, new[] { 1, 3, 5, 7, 9 });
    } 
} 

ClassData也可以用于类似于MemberData的非泛型(基于IEnumerable 的)模型中。 Andrew Lock在这个主题上有几篇很棒的博客文章。 您还可以在github上的xUnit示例中看到这一点。

房项禹
2023-03-14

首先,您正在编写测试内部的逻辑。

您希望测试一个单独的类。

第二,你会在哪里通过预期的结果?

你可以找到一种方法将多个数据传递给你的测试,就像Arsalan在他的回答中所说的那样,或者你的断言应该检查所有的数字都是奇数,并且它们是按升序排列的。

您可以查看FluentAssertions库,并按如下方式编写测试:

// The class/method you are testing
public class MyLogic
{
  public int[] SortOddNumbers(int[] input)
  {
    return input.Where(n => (n%2) == 1).OrderBy(n => n).ToArray();
  }
}

和测试:

public class MyLogic.Tests
{

  [Theory]
  [InlineData(6,1,2,3,10,9,8)]
  public void SortOddNumbers_ShouldReturn_OddNumbersInAscendingOrder(params int[] input)
  {
    // Arrange
    var logic = new MyLogic();
    // Act
    var actual = logic.SortOddNumbers(input);
    // Assert
    actual.Should().OnlyContain(x => x % 2 == 1);
    actual.Should().BeInAscendingOrder(x => x);
  }
}

编辑:为了找到如何将数据传递给测试的多种方法(和灵感),下面是Andrew Lock的一篇优秀文章:https://andrewlock.net/creating-parameterised-tests-in-xunit-with-inlinedata-classdata-and-memberdata/

闾丘山
2023-03-14

您应该在测试中传递输入数组和预期数组作为参数。

您可以使用InlineData,如下所示:

    [Theory]
    [InlineData(new[] { 0, 1, 2, 3, 4 }, new[] { 0, 2, 4 })]
    [InlineData(new[] { 0, 1, 3, 4 }, new[] { 0, 4 })]
    public void Should_return_odd_numbers_in_ascending_order(int[] input, int[] expectedSortedArray)
    {
        var result = input.SortOddNumbers();

        result.Should().BeEquivalentTo(expectedSortedArray, opt => opt.WithStrictOrdering());
    }

或者您可以像这样使用MemberData:

    public static IEnumerable<object[]> Data => new List<object[]>
    {
       new object[] {new[] {0, 1, 2, 3, 4}, new[] {0, 2, 4}},
       new object[] {new[] {0, 1, 3, 4}, new[] {0, 4}}
    };

    [Theory, MemberData(nameof(Data))]
    public void Should_return_odd_numbers_in_ascending_order(int[] input, int[] expectedSortedArray)
    {
        var result = input.SortOddNumbers();

        result.Should().BeEquivalentTo(expectedSortedArray, opt => opt.WithStrictOrdering());
    }

和SortOddNumbers扩展方法:

public static class NumberExtensions
{
    public static int[] SortOddNumbers(this int[] input)
    {
        return input.Where(i => (i % 2) == 0).OrderBy(i => i).ToArray();
    }
}
 类似资料:
  • 问题内容: 如何获得XUnit格式的Go测试库输出以与Jenkins集成?没有命令行选项可使用输出到XML或XUnit格式。 问题答案: 有一个很好的小插件可以转换:https : //github.com/tebeka/go2xunit 要安装它: 要使用它: 如果您的情况正常:

  • 我昨晚睡觉时所有的测试都出现了,今天重新加载了项目,无论我怎么尝试,VS测试运行程序都没有得到任何东西。 昨天,当我加载项目时,我遇到了类似的问题,但通过添加对Microsoft.DotNet.内部成就的引用来解决它 - 正如这篇文章所建议的那样:链接。但是,即使有参考文献,它现在也在做同样的事情。我现在也尝试了帖子中的几乎所有答案,但无济于事。 我已经与一个基本的控制台项目进行了比较,除了包含的

  • 问题内容: 我决定使用非常简单的算法创建简单的 isEven 和 isOdd 函数: 如果n具有某些参数,那是可以的,但是在许多情况下会失败。因此,我着手创建健壮的函数,以便在尽可能多的情况下提供正确的结果,以便仅测试javascript数字范围内的整数,其他所有结果均返回false(包括+和-无限)。注意零是偶数。 谁能看到上述任何问题?是否有更好的版本(即更准确,更快或更简洁而不被混淆)? 有

  • 问题内容: 找出数字/变量在PHP中是奇数还是偶数的最简单,最基本的方法是什么?与mod有关吗? 我已经尝试了一些脚本,但是.. google目前无法交付。 问题答案: 您认为mod是一个不错的起点是正确的。这是一个表达式,如果是偶数则返回true,如果是奇数则返回false: 例: 输出: 甚至

  • 问题内容: 根据JUnit格式化的测试输出,我使用https://github.com/garcus/wct-xunit- reporter 创建了XUnit报告xml 。 Jenkins无法显示测试结果,这是行不通的。我试过了: 不同的XUnit测试结果(发布xUnit测试结果报告:[xUnit] [错误]-结果文件’.... / testfile.xml’的转换文件(在度量标准’NUnit’的

  • 我有一个 xUnit.net 测试,如下所示: VS 2012的xUnit插件表示: 未找到要运行的测试。 TestDriven.net运行良好,但提到了一些关于特设: 1通过,0失败,0跳过(请参阅“任务列表”),这花费了0.47秒(临时) TeamCity、和和Visual Studio也找不到 (我已经安装了,VS看到了一些测试。) 什么原因?

  • 发帖目的: 面试回忆、个人复盘、自我提升;无不良目的,内容仅供参考; bg:双非本硕;实验室项目*2;实习*2 11.2 1面25min 1、自我介绍 2、你认为自己优点和缺点是什么 3、朋友对你的看法 4、测试工具用了哪些 5、怎么去充分地测试到你想覆盖到的功能 6、你设计的测试计划中包含了什么? 7、异常测试怎么设计 8、针对蓝牙车钥匙,设计测试用例(正常和异常) 9、协议层怎么测 10、测一