问题 - 如果我使用Visual Studio 2008在C#中启动Windows窗体应用程序,我应该使用哪个单元测试框架?
VS2008似乎有一个版本?或者我应该看看像NUnit这样的东西?或者是NUnit在发动机罩下的VS2008中使用了什么?什么是最受欢迎的.
拥有允许以下内容的东西会很好:(a)模拟/存根,以及(b)断言异常的能力
谢谢
如果我有微服务,它应该创建用户,但由于用户创建很复杂,它使用队列,用户实际上是由消费者创建的,端点只接受请求并返回正常或失败.
如何为此验收标准创建验收测试:
给定:想要注册的用户
何时:请求api 创建用户
然后:创建用户并为新用户设置托管环境_id
为此,我必须等待环境实际设置,这需要30秒.如果我在我的测试中实现睡眠,那么我点击反模式等待,看看如何正确测试它而不失败最佳实践?
在为企业构建应用程序时要避免哪些关键的反模式?我们正在使用C#和SQL Server以及Silverlight,但是我认为一些反模式将是语言中立的.
假设定义了接口
interface Foo {
int getBaz();
void doBar();
}
Run Code Online (Sandbox Code Playgroud)
进一步假设合同规定每次doBar被称为baz都会增加.(好的,这是一个人为的代码,但在这里坚持我)
现在我想提供一个单元测试,我可以提供给Foo实施者,以便他们可以验证他们是否符合所有合同条件.
class FooTest {
protected Foo fooImpl;
@Test
public void int testBazIncrement()
{
int b = fooImpl getBaz();
fooImpl.doBar();
Assert.assertEquals( b+1, fooImpl.getBaz();
}
}
Run Code Online (Sandbox Code Playgroud)
将测试提供给Foo的实现者的最佳实践是什么?在我看来,需要一种机制让他们调用FooTest并提供Foo或FooFactory来构造Foo实例.此外,如果有很多测试(想想大接口),那么我想把所有这些测试放在一个FooTest类中.
有没有关于如何实施此类测试的最佳实践?
我知道每个测试框架的答案可能不同.但对于你知道的人,会发生什么?
我一直试图找出编写测试友好代码的最佳实践,但更具体地说是与对象构造相关的实践.在蓝皮书中,我们发现在创建对象时应该强制执行不变量,以避免我们的实体,值对象等的损坏,考虑到这一点,Design By Contract似乎是避免我们的对象损坏的解决方案,但是当我们遵循这个,我们最终可能会编写如下代码:
class Car
{
//Constructor
public Car(Door door, Engine engine, Wheel wheel)
{
Contract.Requires(door).IsNotNull("Door is required");
Contract.Requires(engine).IsNotNull("Engine is required");
Contract.Requires(wheel).IsNotNull("Wheel is required");
....
}
...
public void StartEngine()
{
this.engine.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
嗯,这看起来很好看吗?看来我们正在构建一个安全类,暴露了所需的契约,因此每次Car创建对象时我们都可以确定该对象是"有效的".
现在让我们从测试驱动的角度来看这个例子.
我想构建测试友好的代码,但为了能够隔离测试我的Car对象我需要为每个依赖创建一个模拟存根或一个虚拟对象来创建我的对象,即使我可能只是想测试一种方法,只使用这些依赖项之一,如StartEngine方法.遵循Misko Hevery的测试理念我想编写我的测试,明确指出我不关心Door或Wheel对象只是将null引用传递给构造函数,但是因为我正在检查null,所以我不能这样做
这只是一小段代码,但是当您面对真正的应用程序时,编写测试变得越来越难,因为您必须解决主题的依赖关系
Misko建议我们不要滥用代码中的空值检查(这与设计合同相矛盾)因为这样做,编写测试会变得很痛苦,作为替代方案,他认为编写更多的测试比"只有这样的测试"更好.我们的代码是安全的,因为我们到处都有空检查"
你对此有何看法?你会怎么做?什么应该是最好的做法?
unit-testing design-by-contract dependency-injection constructor-injection
问:如何检测真实的测试覆盖率?
我注意到代码覆盖率指标和测试质量存在一个问题:100%的代码覆盖率并不意味着代码经过了真正的测试.
有时候测试会提供100%的覆盖率,即使它没有覆盖所有内容.问题在于覆盖范围定义,我们假设coverage ==可达代码.
但事实并非如此,代码可以100%可达,但不能100%覆盖测试.
看一下示例,此测试提供100%覆盖率(EMMA),但实际上它不包括将传递给服务模拟的值.因此,如果值将被更改,测试将不会失败.
例:
public class User {
public static final int INT_VALUE = 1;
public static final boolean BOOLEAN_VALUE = false;
public static final String STRING_VALUE = "";
private Service service;
public void setService(Service service) {
this.service = service;
}
public String userMethod() {
return service.doSomething(INT_VALUE, BOOLEAN_VALUE, STRING_VALUE);
}
}
Run Code Online (Sandbox Code Playgroud)
并测试它:
public class UserTest {
private User user;
private Service easyMockNiceMock;
@Before
public void setUp() throws Exception {
user = new User();
easyMockNiceMock = …Run Code Online (Sandbox Code Playgroud) 我读到这个答案,告诉Mockery是TDD的反模式.可是等等!我们必须模拟/存根所有依赖项来编写单元测试.在其他情况下,它将是一个集成测试.