如何对用例进行单元测试
How to take a Use Case to Unit Test
这是我的用例
要开始在 TDD 中编写单元测试,我需要想出 类 和测试方法,例如ClassUnderTest.MethodUnderTest()
名词有:Candidate
、Admin
、User
、Account
、Credentials
、Password
、ResumeWidget
(系统),最后但同样重要的是,SomeOtherAbstractionIDidNotThinkOf
(例如 SecurityService
)。
动词有:Login()
、Logout()
、Register()
、CreateAccount()
、RecoverPassword()
、Unlock()
、ResetPassword()
, Lockout()
, 最后但同样重要的是, SomeOtherActionIDidNotThinkOf()
.
为了让这个问题最简单,让我们看看是否可以坚持Login()
。让我看看是否可以为该方法启动单元测试。
你有什么登录方法吗?
如果是这样,您会 Class 放什么?为什么?
如果没有,您会使用什么 Class 和方法?为什么?
我给你一个关于如何开始 TDD 的小提示。首先,考虑如何根据您的用例设计您的软件。(例如:帐户 class 可以包含登录、注销等方法)
[TestFixture]
public class AccountTest
{
public Account underTest;
[SetUp]
public void setUp()
{
underTest = new Account();
}
[Test]
public void TestLoginWithValidCredentials()
{
bool isValid = underTest.Login('userName', 'password');
Assert.True(isValid );
}
[Test]
public void TestLoginWithInValidCredentials()
{
bool isValid = underTest.Login('', '');
Assert.False(isValid );
}
[Test]
//Assert Expected Lockout exception here
public void TestLockoutByPassingInValidCredentialsMoreThan5Times()
{
for (int i =0; i< 5; i++)
{
bool isValid = underTest.Login('', '');
Assert.False(isValid );
}
// the system should throw an exception about lockout
underTest.Login('', '');
}
[Test]
public void TestCreateAccount()
{
//Register event can directly call this method
bool isCreated = underTest.Create(/*User Object*/);
Assert.True(isCreated );
}
[Test]
public void TestLogout()
{
bool success = underTest.Logout('userName');
Assert.True(success);
}
[Test]
public void TestReset()
{
// both Unlock and RecoverPassword event can share this method
bool success = underTest.Reset('userName');
// mock the password reset system and return the expected value like 'BSy6485TY'
Assert.AreEqual('BSy6485TY', password);
}
}
更新:添加了更多测试用例以帮助您设计系统。
这是我的用例
要开始在 TDD 中编写单元测试,我需要想出 类 和测试方法,例如ClassUnderTest.MethodUnderTest()
名词有:Candidate
、Admin
、User
、Account
、Credentials
、Password
、ResumeWidget
(系统),最后但同样重要的是,SomeOtherAbstractionIDidNotThinkOf
(例如 SecurityService
)。
动词有:Login()
、Logout()
、Register()
、CreateAccount()
、RecoverPassword()
、Unlock()
、ResetPassword()
, Lockout()
, 最后但同样重要的是, SomeOtherActionIDidNotThinkOf()
.
为了让这个问题最简单,让我们看看是否可以坚持Login()
。让我看看是否可以为该方法启动单元测试。
你有什么登录方法吗?
如果是这样,您会 Class 放什么?为什么?
如果没有,您会使用什么 Class 和方法?为什么?
我给你一个关于如何开始 TDD 的小提示。首先,考虑如何根据您的用例设计您的软件。(例如:帐户 class 可以包含登录、注销等方法)
[TestFixture]
public class AccountTest
{
public Account underTest;
[SetUp]
public void setUp()
{
underTest = new Account();
}
[Test]
public void TestLoginWithValidCredentials()
{
bool isValid = underTest.Login('userName', 'password');
Assert.True(isValid );
}
[Test]
public void TestLoginWithInValidCredentials()
{
bool isValid = underTest.Login('', '');
Assert.False(isValid );
}
[Test]
//Assert Expected Lockout exception here
public void TestLockoutByPassingInValidCredentialsMoreThan5Times()
{
for (int i =0; i< 5; i++)
{
bool isValid = underTest.Login('', '');
Assert.False(isValid );
}
// the system should throw an exception about lockout
underTest.Login('', '');
}
[Test]
public void TestCreateAccount()
{
//Register event can directly call this method
bool isCreated = underTest.Create(/*User Object*/);
Assert.True(isCreated );
}
[Test]
public void TestLogout()
{
bool success = underTest.Logout('userName');
Assert.True(success);
}
[Test]
public void TestReset()
{
// both Unlock and RecoverPassword event can share this method
bool success = underTest.Reset('userName');
// mock the password reset system and return the expected value like 'BSy6485TY'
Assert.AreEqual('BSy6485TY', password);
}
}
更新:添加了更多测试用例以帮助您设计系统。