您的单元测试(每秒测试次数)的目标是什么样的执行率?单个单元测试需要多长时间?
我有兴趣知道人们是否有任何特定的阈值来确定他们的测试是否太慢,或者只是当长时间运行的测试套件的摩擦力变得更好时?
最后,当您确定测试需要更快地运行时,您使用什么技术来加速测试?
注意:集成测试显然是另一回事.我们严格地谈论需要尽可能频繁运行的单元测试.
回复综述:感谢迄今为止的出色回应.大多数建议似乎都不用担心速度 - 专注于质量,如果速度太慢就选择性地运行它们.具有特定数字的答案包括每次测试的目标是<10ms,最多0.5秒和1秒,或者只需将整套常用测试保持在10秒以内.
当他们都很有帮助时,不确定将一个标记为"已接受的答案"是否正确:)
我一直在努力使我的标准方法适应测试驱动.NET代码到Ruby.
作为一个例子,我正在写一个类:
grab all *.markdown files from a directory
foreach file:
extract code samples from file
save code to file.cs in output directory
Run Code Online (Sandbox Code Playgroud)
通常对于.NET,我最终会得到类似的东西:
class ExamplesToCode {
public ExamplesToCode(IFileFinder finder, IExampleToCodeConverter converter) { ... }
public void Convert(string exampleDir, string targetDir) { ... }
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中(首先写的),我是模拟查找器和转换器.然后,我踩灭了finder.FindFiles("*.markdown")回说["file1", "file2"],检查converter.Convert("file1", targetDir)和converter.Convert("file2", targetDir)被调用.
我努力将这个应用于Ruby的地方是Ruby倾向于使用块和内部迭代器(例如array.each { |x| puts x }),并且包括模块而不是构造函数注入.我不确定如何在这些情况下对代码进行单元测试(没有设置完整的集成测试),而且.NET方法看起来非常不完美; 它似乎与Ruby自然运作的方式作斗争.
有关如何以Ruby方式执行此操作的任何建议?这个例子的Ruby测试的例子很棒.
假设我使用以下界面(假设我们不能改变我们的实现以使其IObservable<T>成为一样IProperty<T>).
public interface IProperty<T> {
T Value { get; set; }
event Action ValueChanged;
}
Run Code Online (Sandbox Code Playgroud)
我试图观察T随着值的变化而生成的s 的集合.因为事件被声明为Action而不是标准的.NET事件模式,所以我认为我无法使用Observable.FromEvent(...).
我想出了一个似乎有效的包装器,但作为一个Rx新手,我确信我错过了一些内置的抽象(或者我可能只是做了整件事).
有没有办法使用内置的Rx功能?如果没有,我的包装器是否缺少任何明显的抽象,或者我应该采取完全不同的方法?
//Example wrapper
public class ObservableProperty<T> : IObservable<T> {
private readonly IProperty<T> _property;
public ObservableProperty(IProperty<T> property) { _property = property; }
public IDisposable Subscribe(IObserver<T> observer) {
Action action = () => observer.OnNext(_property.Value);
_property.ValueChanged += action;
return Disposable.Create(() => _property.ValueChanged -= action);
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在利用Mock对象扩展我的单元测试(在这种特殊情况下为nSubsitute).但是我想知道创建Mock对象时当前的智慧.例如,我正在处理一个包含各种例程的对象来获取和处理数据 - 这里没什么大不了的,但它将在相当多的测试中使用.
我是否应该创建一个共享函数来返回Mock对象,其中包含针对大多数Testing项目模拟的所有适当方法和行为,并将该对象调用到我的单元测试中?或者我应该将对象模拟到每个单元测试中,只模拟我测试所需的行为(尽管有时候我会不止一次地嘲笑相同的行为).
感激地收到了想法或建议......
我正在更新一个与.NET 4.5兼容的版本,而我需要做的更改之一就是更新ilmerge的方式。
从上面的链接,这基本上意味着更改:
/targetplatform:"v4,C:\windows\Microsoft.NET\Framework\v4.0.30319"
Run Code Online (Sandbox Code Playgroud)
至:
/targetplatform:"v4,C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
Run Code Online (Sandbox Code Playgroud)
在我的MSBuild AfterBuild目标中,我正在使用生成前者$(MSBuildToolsPath),如下所示:
/targetplatform:v4,$(MSBuildToolsPath)
Run Code Online (Sandbox Code Playgroud)
将其转换为所需/targetplatform:"v4,C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"路径的最佳方法是什么,以便它可以在x64,x86或可以安装的任何不寻常的地方工作?
我试图从大部分自由格式的文本中解析一些信息.我尝试在FParsec中实现,但我之前没有使用它,我不确定我是否做错了,或者即使它非常适合这个特定的问题.
我想从markdown文档("examplecode"和"requiredcode"标签)中解析出一组特定Liquid标签的内容.降价主要是自由格式文本,偶尔会在Liquid标签内阻塞,例如:
Some free form text.
Possibly lots of lines. Maybe `code` stuff.
{% examplecode opt-lang-tag %}
ABC
DEF
{% endexamplecode %}
More text. Possibly multilines.
{% othertag %}
can ignore this tag
{% endothertag %}
{% requiredcode %}
GHI
{% endrequiredcode %}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我需要解析[ "ABC\nDEF"; "GHI" ].
我所追求的解析逻辑可以强制表达.循环遍历每一行,如果我们找到一个我们感兴趣的开始标记,则采用直到我们匹配结束标记并将这些行添加到结果列表中,否则跳过行直到下一个开始标记.重复.
这可以通过循环或折叠,或使用正则表达式来完成:
\{%\s*(examplecode|requiredcode).*\%}(.*?)\{%\s*end\1\s*%\}
我发现很难在FParsec中表达上面的逻辑.我想写类似的东西between s t (everythingUntil t),但我不知道如何在不everythingUntil消耗结束令牌的情况下实现它,导致between失败.
我最终得到了以下内容,它不处理嵌套的事件"{%",但似乎通过了我关心的主要测试用例:
let trimStr (s : string) = s.Trim()
let …Run Code Online (Sandbox Code Playgroud) 我想通过FluentAssertion语法检查方法的返回值。请考虑以下片段:
public interface IFoo
{
Task<int> DoSomething();
}
public class Bar
{
private readonly IFoo _foo;
private static int _someMagicNumber = 17;
public Bar(IFoo foo)
{
_foo = foo;
}
public async Task<int> DoSomethingSmart()
{
try
{
return await _foo.DoSomething();
}
catch
{
return _someMagicNumber;
}
}
}
[TestFixture]
public class BarTests
{
[Test]
public async Task ShouldCatchException()
{
// Arrange
var foo = Substitute.For<IFoo>();
foo.DoSomething().Throws(new Exception());
var bar = new Bar(foo);
Func<Task> result = () => bar.DoSomethingSmart(); …Run Code Online (Sandbox Code Playgroud) .net ×3
c# ×3
unit-testing ×2
f# ×1
fparsec ×1
mocking ×1
msbuild ×1
nsubstitute ×1
nunit ×1
performance ×1
ruby ×1
tdd ×1
testing ×1