Flutter

Widget Test Flutter

1. Login Page

Tạo class LoginPage đặt tên tập tin là login_page.dart với nội dung sau:

class LoginPage extends StatefulWidget {
  final String title;
  const LoginPage({super.key, required this.title});
  @override
  State<StatefulWidget> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
  String? _msg;
  TextEditingController _emailController = TextEditingController();
  TextEditingController _passwordController = TextEditingController();
  var _formKey = GlobalKey<FormState>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: Form(
        key: _formKey,
        child: Column(
          children: [
            TextFormField(
              validator: _validateEmail,
              key: Key("email"),
              controller: _emailController,
              decoration: InputDecoration(labelText: 'Email'),
            ),
            TextFormField(
              validator: _validatePassword,
              key: Key("password"),
              controller: _passwordController,
              decoration: InputDecoration(labelText: 'Password'),
            ),
            ElevatedButton(
              key: Key("login"),
              onPressed: _login,
              child: Text('Login'),
            ),
            if (_msg != null) Text(_msg!),
          ],
        ),
      ),
    );
  }
  String? _validatePassword(String? password) {
    if (password == null || password.isEmpty) return "Please enter password";
    if (password.length < 3) return "Please enter password min 3 character";
    return null;
  }
  String? _validateEmail(String? email) {
    if (email == null || email.isEmpty) return "Please enter email";
    RegExp regExp = RegExp(r'^[a-z][a-z0-9]+@[a-z0-9]{2,}(\.[a-z]{2,})+$');
    return regExp.hasMatch(email) ? null : "Email invalid";
  }
  void _login() {
    if (_formKey.currentState!.validate()) {
      String email = _emailController.text.trim();
      String password = _passwordController.text.trim();
      setState(() {
        if (email == "thanh@ceb.net.vn" && password == "123") {
          _msg = "Login Success";
        } else {
          _msg = "Login Failed";
        }
      });
    }
  }
}

2 Login test

Tạo file login_page_test.dart với nội dung như sau:

void main() {
  testWidgets('Login Page Test Success', (tester) async {
    await tester.pumpWidget(
      const MaterialApp(home: LoginPage(title: 'Login Page')),
    );
    await tester.enterText(find.byKey(const Key('email')), "thanh@ceb.net.vn");
    await tester.enterText(find.byKey(const Key("password")), '123');
    await tester.tap(find.byKey(const Key('login')));
    await tester.pump();
    expect(find.text('Login Success'), findsOneWidget);
  });
}