在这篇文章中,我们将为您详细介绍使用XUnit断言异常的内容,并且讨论关于断言使用错误的相关问题。此外,我们还会涉及一些关于.net–构建xunit.xml文件后我应该使用xUnitPublisher
在这篇文章中,我们将为您详细介绍使用 XUnit 断言异常的内容,并且讨论关于断言使用错误的相关问题。此外,我们还会涉及一些关于.net – 构建xunit.xml文件后我应该使用xUnitPublisher还是xUnitBuilder?、.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言、AsUnit与FlexUnit相比 – 哪个“更好”?、java – 在JUnit中断言异常的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 使用 XUnit 断言异常(断言使用错误)
- .net – 构建xunit.xml文件后我应该使用xUnitPublisher还是xUnitBuilder?
- .net持续集成测试篇之Nunit文件断言、字符串断言及集合断言
- AsUnit与FlexUnit相比 – 哪个“更好”?
- java – 在JUnit中断言异常
使用 XUnit 断言异常(断言使用错误)
我是 XUnit 和 Moq 的新手。我有一个将字符串作为参数的方法。如何使用 XUnit 处理异常。
[Fact]public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException() { //arrange ProfileRepository profiles = new ProfileRepository(); //act var result = profiles.GetSettingsForUserID(""); //assert //The below statement is not working as expected. Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID(""));}
被测方法
public IEnumerable<Setting> GetSettingsForUserID(string userid){ if (string.IsNullOrWhiteSpace(userid)) throw new ArgumentException("User Id Cannot be null"); var s = profiles.Where(e => e.UserID == userid).SelectMany(e => e.Settings); return s;}
答案1
小编典典Assert.Throws表达式将捕获异常并断言类型。但是,您在断言表达式之外调用被测方法,因此测试用例失败。
[Fact]public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException(){ //arrange ProfileRepository profiles = new ProfileRepository(); // act & assert Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID(""));}
如果一心要遵循 AAA,您可以将操作提取到它自己的变量中。
[Fact]public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException(){ //arrange ProfileRepository profiles = new ProfileRepository(); //act Action act = () => profiles.GetSettingsForUserID(""); //assert ArgumentException exception = Assert.Throws<ArgumentException>(act); //The thrown exception can be used for even more detailed assertions. Assert.Equal("expected error message here", exception.Message);}
请注意异常如何也可用于更详细的断言
如果进行异步测试,则
Assert.ThrowsAsync与前面给出的示例类似,除了应该等待断言之外,
public async Task Some_Async_Test() { //... //Act Func<Task> act = () => subject.SomeMethodAsync(); //Assert var exception = await Assert.ThrowsAsync<InvalidOperationException>(act); //...}
.net – 构建xunit.xml文件后我应该使用xUnitPublisher还是xUnitBuilder?
鉴于我的Jenkins文件中的以下片段,我为每个测试项目生成一个XML文件.在下一步中,我想处理这些XML文件.
jenkins有两种选择.我很困惑使用哪个选项.我使用“进程”还是“发布”.两者都给出了关于阈值的相同选项,两者似乎都是一样的.它们都标记了构建失败,它们都为Jenkins提供了测试报告.这是遗产吗?或者他们是完全不同的步骤,有自己的目的吗?
顺便说一下,这次FAILURE检查并抛出错误是阻止Jenkins继续构建的唯一方法吗?当构建标记为Failed以继续其余步骤时,似乎有点奇怪.如果我想继续,我也可以将stopProcessingIfError设置为false,或者我错过了这一点?
stage('Test') { def testScript = "" def testProjects = findFiles(glob: 'test/**/project.json') if (!fileExists('reports/xml')) { if (!fileExists('reports')) { sh "mkdir reports" } sh "mkdir reports/xml" } for(prj in testProjects) { println "Test project located,running tests: " + prj.path def matcher = prj.path =~ 'test\\/(.+)\\/project.json' testScript += "dotnet test --no-build '${prj.path}' -xml 'reports/xml/${matcher[0][1]}.Results.xml' || true\n" } sh testScript step([ $class: 'XUnitBuilder',thresholdMode: 1,thresholds: [[$class: 'FailedThreshold',failureThreshold: '1']],tools: [[ $class: 'XUnitDotNetTestType',deleteOutputFiles: true,failIfNotNew: true,pattern: 'reports/xml/*.Results.xml',skipNoTestFiles: false,stopProcessingIfError: true ]] ]) if (currentBuild.result.equals("FAILURE")) { throw "Test results did not pass thresholds" } }
关键的区别似乎是XUnitPublisher类扩展了hudson.tasks.Recorder
类,而XUnitBuilder扩展了hudson.tasks.Builder
.
我认为面向用户的区别在于,构建器中的失败将Jenkins作业标记为“失败”,而发布者中的失败则将作业标记为“不稳定”. (来源:https://wiki.jenkins.io/display/JENKINS/Terminology)
鉴于这一切,我建议使用xUnitPublisher.我设置我的构建命令,如果编译通过但是一些测试失败,则返回0.这样,Jenkins给我一个Failed状态,用于破解编译和工作编译的UNSTABLE状态,但是测试失败.我喜欢这样.
提交历史并不能解释为什么存在这种荒谬的代码重复.我知道如果一个是以另一个方式实现的,就像通常在弃用时所做的那样……可能是因为每个都必须有一个不同的超类.
XUnitBuilder.java,XUnitPublisher.java
.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言
系列目录
使用前面讲过的方法基本上能够完成工作中的大部分任务了,然而有些功能实现起来还是比较麻烦的,比如说字符串相等性比较不区分大小写,字符串是否匹配某一正则规则,集合中的每一个(某一个)元素是否符合特定规则
等,Nunit提供了一些特定的方法用来实现一些用普通断言比较难以实现的扩展类型和方法.
下面介绍一下StringAssert类型下面的方法
StringAssert.AreEqualIgnoringCase(string expected,string actual)
此方法用于断言两个字符串在不区分大小写情况下是否相等,需要提供两个参数,第一个是期待的结果,第二个是实际结果.这个方法比较简单,不再提供示例.
需要注意的是Nunit里有许多需要提供两个参数的方法,一般情况下都是第一个是期待的结果,第二个是实际结果
StringAssert.Contains
用于断言一个字符串是否包含另一字符串,其中第一个参数为被包含的字符串,第二个为实际字符串,这个方法语义不是特别明确,需要注意
[Test]
public void DemoTest()
{
StringAssert.Contains("hello", "hello,world");
}
这段代码片段会返回成功
StringAssert.StartsWith
用于断言字符串是否以某(几)字符开始
[Test]
public void DemoTest()
{
StringAssert.StartsWith("h", "hello,world");
}
StringAssert.EndsWith
与StringAssert.StartsWith类似,string类也有此方法,相信大家都比较熟悉
StringAssert.IsMatch
用于断言指定字符串是否匹配某一正则规则
**[warning]**这个方法并没有大小写开关
下面介绍两个与
文件(目录)
有关的断言类FileAssert和DirectoryAssert.两个类下面的断言方法基本一样,只是一个是断言文件,一个是断言目录.下面以FileAssert为例说明
FileAssert.AreEqual
这个方法用于断言两个文件是否是同一个文件,接受字符串参数
需要说明的是,字符串路径必须指向文件,而不能是目录或者不存在的文件.
FileAssert.Exists
用于断言某个文件是否存在,接受字符串参数
或者FileInfo
作为参数
DirectoryAssert方法类似,并且这些方法都对应的有相反方向的断言,方法名包含Not,很容易理解
单元测试过程中,我们很多时候都要处理集合,Nunit里提供了一个 CollectionAssert 类用于处理对集合类型的断言
下面介绍一下这个类下面的断言方法
CollectionAssert.AllItemsAreInstancesOfType
用于断言集合里面的元素是否都是某一特定类型.
[Test]
public void DemoTest()
{
ArrayList ar = new ArrayList {"a", "b", "c"};
CollectionAssert.AllItemsAreInstancesOfType(ar, typeof(string));
}
以上断言会返回成功,因为我们向ArrayList里添加的全是string类型的元素
需要注意,很多断言方法第一个参数是期待类型,第二个是实际类型,而此方法则相反,第一个是实际集合,第二个是期待的类型
这里的类型支持父类,比如说如果是
typeof(object)
也同样能通过,语义上来讲,元素是string类型,也是object类型,讲得通的
CollectionAssert.AllItemsAreNotNull
用于断言集合里的元素全部不是Null,也即集合不包含null元素,这个方法只有一个参数,传入我们要判断的集合即可
CollectionAssert.AllItemsAreUnique
用于断言集合里面的元素全部是惟一的,即集合里没有重复元素.
**[warning]**需要注意的是,这个方法并没有提供一个重载支持自定义比较器,它只能用于断言简单类型,如string,int,datetime等是否惟一,如果是类类型则需要重载
equals
和gethashcode
但是通常我们并不这样做,而是在类外部提供一个比较器,如果判断复杂类型是否惟一,我们在以后再介绍
下面举一个例子说明这个问题
[Test]
public void DemoTest()
{
Person[] psn = new Person[] {
new Person { Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)},
new Person { Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)}};
CollectionAssert.AllItemsAreUnique(psn);
}
以上代码测试会通过,因为两个new出来的Persn不是同一个对象,但实际业务中,两个对象的属性完全相等时我们就认为它们是相等的,以上我们期待的结果是 不通过
CollectionAssert.AreEqual
用于断言两个集合是否相等,如果两个集合里的元素都是简单对象,如果是复杂对象用这个方法并不是很方便(虽然此方法提供提供IComparer作为参数,然而IComparer对集合并不是很方便)
**[warning]**这里的两个集合相等第一集合元素个数必须相等(不用多说),第二集合元素的
顺序必须一致的
还有一点需要说明还有一点需要说明,如以上所说,两个集合元素顺序一致,并且在运行时类型是一致的就会被认为是相等,这两个集合的
类型不必一样
,比如说一个是array,一个是list,泛型参数也不必须一样
只要在运行时类型是一致的即可
请看下面一段代码
[Test]
public void DemoTest()
{
int[] a = {3, 4, 5};
List<object> b =new List<object> {3, 4, 5};
CollectionAssert.AreEqual(a, b);
}
a和b两个集合的集合类型不一样,泛型类型也不一样,但是运行的时候却是一样的,因此以上代码执行会返回成功状态
CollectionAssert.AreEquivalent
这个方法用来判断两个集合的元素是否等价,如果两个集合元素类型相同,个数也相同,即视为等价,与上面的方法相比,它不关心顺序
[Test]
public void DemoTest()
{
int[] a = {3, 4, 5};
List<object> b =new List<object> {4,3, 5};
CollectionAssert.AreEquivalent(a, b);
}
以上代码测试是通过的
CollectionAssert.Contains
用于断言集合是否包含某一元素
需要说明的是.要判断集合中是否包含某一元素,只要集合运行时有特定元素和指定元素类型相同,并且值相同,即认为集合包含这一元素
请看以下代码片段
[Test]
public void DemoTest()
{
int[] a = {3, 4, 5};
object element = 4;
List<object> b =new List<object> {element,3, 5};
CollectionAssert.Contains(b, 4);
}
以上代码段中b集合虽然不包含值为4的int类型元素,只有object类型的值为4的元素,然而它在运行时真正的类型是int,因此以上测试也是通过的.
CollectionAssert.IsEmpty
用于断言某一集合是空集合,即元素个数为0
CollectionAssert.IsOrdered
用于断言集合元素是否按<font color=blue>正序</font>排列,所谓正序列,是指按阿拉伯数字或者字符表顺序正序排列.
CollectionAssert.IsSubsetOf
用于判断一个集合是否为另一个集合的子集,与以上相同的是,这两个集合不必是同一类集合(可以一个是array,一个是list),只要一个集合的元素完全包含在另一个集合中,即认为它是另一个集合的子集
只要一个集合元素完全包含在另一个集合中即可,顺序不必相同
CollectionAssert.IsSupersetOf
用于断言一个集合是否是另一个集合的父集,与子集判断用法一样.
以上大部分方法都有一个判断相反的方法,名称中多一个Not,这里不再罗列
AsUnit与FlexUnit相比 – 哪个“更好”?
有没有理由去学习另一个?在某种程度上,一个“更好”吗?
解决方法
由于Adobe即将推出的FlashBuilder 4版本中新的FlexUnit工具支持,fluint项目和FlexUnit项目已经合并,以创建一个新的单元测试套件,现在称为FlexUnit 4.0. FlashBuilder IDE将在工具级支持FlexUnit 4.0.这种新的工具支持与great new features of FlexUnit 4.0的一些功能相结合,使新的FlexUnit成为ActionScript 3和Flex代码中单元测试的明智选择.
java – 在JUnit中断言异常
我需要编写一个JUnit测试用例,它将测试一个传递不同排列的函数,并得到相应的结果.
成功的用例不返回任何内容,而失败的排列会抛出异常(异常类型无关紧要).
例如. testAppleisSweetAndRed(水果,颜色,味道)
测试会调用以下内容 –
testAppleisSweetAndRed(orange,red,sweet)//throws exception testAppleisSweetAndRed(apple,green,sour)//throws exception testAppleisSweetAndRed(apple,sweet)//OK
如果调用的行为符合预期,则测试成功.
断言如何捕获前3次调用以确保它们确实引发预期的异常?
解决方法
@Rule public ExpectedException exceptions = ExpectedException.none();
这提供了许多可用于改进JUnit测试的功能.如果您看到以下示例,我将在异常上测试3件事.
>抛出的异常类型
>例外消息
>异常的原因
public class MyTest { @Rule public ExpectedException exceptions = ExpectedException.none(); ClassUnderTest testClass; @Before public void setUp() throws Exception { testClass = new ClassUndertest(); } @Test public void testAppleisSweetAndRed() throws Exception { exceptions.expect(Exception.class); exceptions.expectMessage("this is the exception message"); exceptions.expectCause(Matchers.<Throwable>equalTo(exceptionCause)); testClass.appleisSweetAndRed(orange,sweet); } }
我们今天的关于使用 XUnit 断言异常和断言使用错误的分享已经告一段落,感谢您的关注,如果您想了解更多关于.net – 构建xunit.xml文件后我应该使用xUnitPublisher还是xUnitBuilder?、.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言、AsUnit与FlexUnit相比 – 哪个“更好”?、java – 在JUnit中断言异常的相关信息,请在本站查询。
本文标签: