此前,我曾写过关于TDD(测试驱动开发)的文章在这里它解释TDD是如何工作的,以及它将如何在我们日常的日常开发工作有所帮助。提交新代码时,我们要确保我们的功能始终随着应用程序的增长而正常运行。
今天,我将直接介绍如何在Flutter本身中执行TDD。我将首先通过运行创建一个新项目flutter create tryunittesting
。
我们将测试2个简单的Login函数;validateUsername
和validatePassword
。让我们通过创建一个新的文件调用来分离登录逻辑,TextValidator.dart
并这样实现:
class TextValidator {
bool validateUsername(String username) {
return false;
}
bool validatePassword(String password) {
return false;
}
}
TextValidator.dart
这两种方法都准备好实现,我们将首先编写测试。转到测试文件夹并删除widget_tests.dart
。添加一个新的文件调用login_tests.dart
。像这样实现测试用例:
import 'package:flutter_test/flutter_test.dart';
import 'package:tryunittesting/TextValidator.dart';
void main() {
group('Given user is at Login Page', () {
test(
'and user keys in username, username should be at least 8 characters long',
() {
expect(TextValidator().validateUsername('test'), false);
expect(TextValidator().validateUsername('testtest'), true);
});
test(
'and user keys in a password, password must have at least 1 minimum upper case, 1 minimum lower case, 1 numeric number, 1 special character and is at least 8 characters long',
() {
expect(TextValidator().validatePassword('test'), false);
expect(TextValidator().validatePassword('Hh1@2222'), true);
});
});
}
login_tests.dart
在这里,我们期望这些情况:
- 用户名至少应包含8个字符
- 密码至少应包含1个大写字母
- 密码至少应包含1个小写字符
- 密码至少应包含1个数字字符
- 密码至少应包含1个特殊字符
- 密码长度至少为8个字符
在实施之前,尝试运行flutter test test/login_test.dart
,您可能会看到+0 -2: Some tests failed.
这告诉我们0个测试通过(+)和2个测试失败(-)。
现在让我们以TDD模式修复它们!
前往TextValidator.dart
并修复validateUsername
:
bool validateUsername(String username) {
return username.length >= 8;
}
运行测试,您应该看到+1 -1
。
现在修复validatePassword
:
bool validatePassword(String password) {
String pattern = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$';
return RegExp(pattern).hasMatch(password) && password.length >= 8;
}
在这里,我们使用regex
来帮助我们验证模式。如果您现在再次运行测试,则应该+2: All Tests Passed!
您刚刚使用Flutter以TDD方式完成了对应用程序的基本测试!
翻译自:https://medium.com/flawless-app-stories/flutter-tdd-with-unit-tests-5aa73ec3bce5