我相信大多数人都在编写大量的自动化测试,而且在进行单元测试时你也遇到了一些常见的陷阱.
我的问题是你是否遵循任何编写测试的行为规则以避免将来出现问题?更具体一点:良好单元测试的属性是什么,或者您如何编写测试?
鼓励语言不可知的建议.
language-agnostic tdd integration-testing unit-testing testing-strategies
我正在用NUnit和TestDriven.NET插件编写单元测试.我想为这样的测试方法提供参数:
[TestFixture]
public class MyTests
{
[Test]
public void TestLogin(string userName, string password)
{
// ...
}
...
}
Run Code Online (Sandbox Code Playgroud)
如您所见,这些参数是私有数据,因此我不想对它们进行硬编码或将它们放在文件中.实际上我不想把它们写在任何地方,我希望每次运行测试时都会提示.
当我尝试运行此测试时,我在输出窗口中收到以下消息:
TestCase'MyProject.MyTests.TestLogin'未执行:未提供任何参数
所以我的问题是,我如何提供这些参数?我希望TestDriven.NET显示一个提示符,以便我可以输入值,但它没有...
对不起,如果我的问题看起来很愚蠢,答案可能很简单,但我在Google上找不到任何有用的东西......
编辑:我刚刚找到了办法,但这是一个肮脏的把戏......
[Test, TestCaseSource("PromptCredentials")]
public void TestLogin(string userName, string password)
{
// ...
}
static object[] PromptCredentials
{
get
{
string userName = Interaction.InputBox("Enter user name", "Test parameters", "", -1, -1);
string password = Interaction.InputBox("Enter password", "Test parameters", "", -1, -1);
return new object[]
{
new object[] { userName, password }
};
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然对更好的解决方案感兴趣......
所以通常我的应用程序非常小,我的测试框架只是一个控制台项目..我用静态方法在那里添加类并测试我的代码.我发现这种方法非常简单明了(特别是因为你可以看到输出的输出)
我现在在visual studio中有一个很好的小测试项目,所以我对你如何测试看起来不像单元的东西感到有些困惑,例如:
Purchase.LoadAllAsync()//finished loading on the loadcomplete event
Run Code Online (Sandbox Code Playgroud)
我会为此写什么样的单元测试?特别是因为这会根据数据库中的内容而改变吗?
我在SO上做了一些侦察并发现了这个问题: 什么时候测试不是单元测试?
这使我更加困惑,如果测试不是单元测试,你会如何测试?
有时我通常只是在主窗体中编写一个小测试函数,或者在silverlight中编写主页,然后将其删除.但我想使用单元测试是因为测试需要留在那里,所以你可以重新使用它们吗?
我很抱歉,如果我有点太无知!= P
谢谢
更新
还想补充一点:在应用程序本身运行良好的测试怎么样,但是从外部代码调用它时会失败.(这种情况发生在我身上几次)是否会发生在你们身上和/或是否意味着糟糕的设计?