我正在尝试使用Pex来测试一些代码.我有一个抽象类,有四个具体的实现.我为四种具体类型中的每一种创建了工厂方法.我还为抽象类型创建了一个,除非这个好的线程解释,Pex不会使用抽象工厂方法,也不应该使用它.
问题是我的一些代码依赖于四种具体类型(因为创建更多的子类非常非常不可能),但是Pex通过使用Moles来创建存根来破坏代码.
我怎样才能强制Pex使用其中一个工厂方法(任何一个,我不关心)来创建抽象类的实例而不为该抽象类创建Moles存根?是否有PexAssume指令可以实现这一目标?请注意,某些具体类型构成了一种树结构,因此可以ConcreteImplementation从中派生出来AbstractClass,并且ConcreteImplementation具有两种类型的属性AbstractClass.我需要确保树中的任何地方都没有使用存根.(并非所有具体实现都具有AbstractClass属性.)
编辑:
看来我需要添加一些关于类结构本身如何工作的更多信息,但要记住,目标仍然是如何让Pex不要使用存根类.
以下是抽象基类的简化版本及其四个具体实现.
public abstract class AbstractClass
{
public abstract AbstractClass Distill();
public static bool operator ==(AbstractClass left, AbstractClass right)
{
// some logic that returns a bool
}
public static bool operator !=(AbstractClass left, AbstractClass right)
{
// some logic that basically returns !(operator ==)
}
public static Implementation1 Implementation1
{
get
{
return Implementation1.GetInstance;
}
}
}
public class Implementation1 : …Run Code Online (Sandbox Code Playgroud) 是的,可以为"Sum"或"Divide"等函数生成边界值测试.Pex是一个很好的工具.
但更多时候我们会对商业行为进行测试.让我们考虑经典Beck的tdd书中的例子:
[Test]
public void ShouldRoundOnCreation()
{
Money money = new Money(20.678);
Assert.AreEqual(20.68,money.Amount);
Assert.AreEqual(2068,money.Cents);
}
Run Code Online (Sandbox Code Playgroud)
可以生成此测试吗?没有:)我项目中95%的测试检查业务逻辑,无法生成.
Pex(特别是与Moles配对)可以提供100%的代码覆盖率,但是测试套件的高代码覆盖率从未表明,代码经过了充分测试 - 它只能让所有内容都经过测试.这非常危险.
所以,问题是 - Pex真的是有用的工具吗?
VS 2010 powertools的安装帮助在VS 2010中使用了PEX和Moles.现在有了VS 2012,我明白Moles会变成Fakes,但希望保留PEX,请确认.此外,如何在2012年使用PEX.需要安装什么(如VS 2010 powertool)才能在2012年使用它.谢谢!
可能重复:
如何配置Pex以尊重代码合同?
目前,当我运行pex探索时,我在我的类中创建的代码契约被视为pex探索结果中的错误.我想当你使用代码合同进行pex勘探时,合同失败应该被视为预期的行为.这是导致异常的代码.
测试方法:
[PexMethod]
public void TestEquality(Guid userId, string username, string password, string securityQuestion, string securityAnswer)
{
UserSecurity user = UserTools.CreateUser(Guid.NewGuid(), username, password, securityQuestion, securityAnswer);
bool passwordResult = UserTools.VerifyInput(password, user.Password, user.PasswordSalt);
bool securityAnswerResult = UserTools.VerifyInput(securityAnswer, user.SecurityAnswer, user.SecurityAnswerSalt);
Assert.IsTrue(passwordResult, "Password did not correctly re-hash");
Assert.IsTrue(securityAnswerResult, "Security Answer did not correctly re-hash");
}
Run Code Online (Sandbox Code Playgroud)
失败的方法调用:
public static UserSecurity CreateUser(Guid userId, string username, string password, string securityQuestion, string securityAnswer)
{
Contract.Requires(userId != Guid.Empty);
Contract.Requires(!string.IsNullOrWhiteSpace(username));
Contract.Requires(!string.IsNullOrWhiteSpace(password));
Contract.Requires(!string.IsNullOrWhiteSpace(securityQuestion));
Contract.Requires(!string.IsNullOrWhiteSpace(securityAnswer));
Contract.Ensures(Contract.Result<UserSecurity>() != null);
byte[] passwordSalt;
byte[] …Run Code Online (Sandbox Code Playgroud) 那些使用Pex的人,您认为Pex作为工具的优点和缺点是什么?
另外,作为 TDD /单元测试的补充,您认为"自动化探索性测试"的优缺点是什么?
我正在学习C#并且一直在搞乱Pex for fun网站.该站点向您提出重新实施秘密算法的挑战,方法是在站点中键入代码并检查输入和输出在您的实现和秘密实现之间的差异.
无论如何,我被困在一个名为XAndY的基本代码决斗上.
从名称来看,答案显而易见:
public static bool Puzzle(bool x, bool y)
{
return x && y;
}
Run Code Online (Sandbox Code Playgroud)
但是,这是不正确的,Pex告诉我,以下输入产生的结果与秘密实现不同:
输入:
x:true y:true(0x02)
输出:
我的实现:true(0x02)
秘密实施:假
不匹配你的拼图方法产生了错误的结果.
代码:Puzzle(true,PexSafeHelpers.ByteToBoolean((byte)2));
在尝试比较不同类型的true之后出现了很多困惑之后,我意识到Pex正在寻找的实现实际上只是使用了按位AND:
return x & y;
Run Code Online (Sandbox Code Playgroud)
我认为,出于语义和短路的原因,您应该使用逻辑&&来比较布尔值,但无论如何:
x & y并且对于所有可能的bool参数x && y最终没有相同的输出?(或者它可能是Pex中的一些东西吗?)trueC#中不同的bool值?如果是这样,怎么样?如何使用Visual Studio 2015 Ultimate Preview生成"智能单元测试*"?
*微软的S. Somasegar 为Visual Studio 2015 宣布了"智能单元测试"(在"生产力"标题下).该功能基于Pex,使用代码分析生成单元测试.
我正在考虑为我的项目使用Microsoft PEX工具,但我更愿意使用NUnit而不是MSUnit.显然,PEX Extensions项目是专门为此创建的,但它现在没有发布,似乎已经死了.有没有人能够做到这一点?
谢谢!
我正在手工制作新代码.我想确保我不遗余力.
除了指定代码合同以指导Pex之外,我还能做些什么吗?所以它在数字密集型代码中产生了良好的覆盖范围?
尝试在http://research.microsoft.com/en-us/projects/pex/pexconcepts.pdf中搜索关键字"float"以获取一些背景信息.
浮点数的算术约束通过对有理数的转换来近似,并且在Z3之外使用启发式搜索技术来找到浮点约束的近似解.
...并且...
符号推理.Pex使用自动约束求解器来确定哪些值与测试和被测代码相关.但是,约束求解器的能力是,并且总是会受到限制.特别是,Z3不能精确地推理浮点运算.
或者,您是否知道.NET下的工具更适合在.NET下查找数字异常的任务?我知道http://fscheck.codeplex.com/但它不执行符号推理.