Flutter এ Test Cases তৈরি এবং চালানো একটি গুরুত্বপূর্ণ বিষয়, যা আপনাকে আপনার অ্যাপ্লিকেশনের কার্যকারিতা যাচাই করতে এবং বাগ ধরতে সহায়তা করে। Flutter এ মূলত তিন ধরনের টেস্ট আছে:
- Unit Tests: নির্দিষ্ট ফাংশন বা মেথডের লজিক্যাল আউটপুট যাচাই করার জন্য।
- Widget Tests: UI উইজেটের কার্যকারিতা যাচাই করার জন্য।
- Integration Tests: অ্যাপ্লিকেশনের পুরো ফ্লো বা বিভিন্ন স্ক্রিন এবং ফিচারগুলোর মধ্যে ইন্টারঅ্যাকশন যাচাই করার জন্য।
১. Unit Tests
Unit Test হলো সবচেয়ে ছোট এবং নির্দিষ্ট লেভেলের টেস্ট, যেখানে কোনো ফাংশন বা ক্লাসের আউটপুট যাচাই করা হয়। এটি Flutter এ সাধারণত test প্যাকেজ ব্যবহার করে লেখা হয়।
ধাপসমূহ:
testপ্যাকেজ নিশ্চিত করুনpubspec.yamlএ রয়েছে। এটি সাধারণত ডিফল্টভাবে থাকে।testডিরেক্টরির নিচে আপনার টেস্ট ফাইল তৈরি করুন। উদাহরণস্বরূপ:test/calculator_test.dart
Unit Test এর উদাহরণ:
ধরুন আমাদের একটি ক্যালকুলেটর ক্লাস আছে, যা যোগ এবং বিয়োগ ফাংশন প্রদান করে:
// lib/calculator.dart
class Calculator {
int add(int a, int b) => a + b;
int subtract(int a, int b) => a - b;
}
Unit Test ফাইল:
import 'package:flutter_test/flutter_test.dart';
import 'package:your_app/calculator.dart';
void main() {
group('Calculator', () {
test('adds two numbers', () {
final calculator = Calculator();
expect(calculator.add(2, 3), 5);
});
test('subtracts two numbers', () {
final calculator = Calculator();
expect(calculator.subtract(5, 3), 2);
});
});
}
- group: একাধিক টেস্টকে গ্রুপ করে রাখে।
- test: প্রতিটি ইউনিট টেস্টের জন্য ব্যবহৃত হয়।
- expect: আউটপুট যাচাই করতে ব্যবহৃত হয়।
Unit Test রান করতে:
flutter test
২. Widget Tests
Widget Test এর মাধ্যমে Flutter UI উইজেটের আউটপুট এবং ইন্টারঅ্যাকশন যাচাই করা হয়। এটি নিশ্চিত করে যে একটি উইজেট সঠিকভাবে রেন্ডার হচ্ছে এবং ব্যবহারকারীর ইন্টারঅ্যাকশন সঠিকভাবে হ্যান্ডেল হচ্ছে কিনা।
Widget Test এর উদাহরণ:
ধরুন আমাদের একটি সিম্পল কাউন্টার অ্যাপ আছে:
// lib/counter.dart
import 'package:flutter/material.dart';
class Counter extends StatefulWidget {
@override
_CounterState createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int _count = 0;
void _increment() {
setState(() {
_count++;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Count: $_count'),
ElevatedButton(
onPressed: _increment,
child: Text('Increment'),
),
],
);
}
}
Widget Test ফাইল:
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:your_app/counter.dart';
void main() {
testWidgets('Counter increments when button is pressed', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp(home: Counter()));
// চেক করা হচ্ছে যে ইনিশিয়ালি 'Count: 0' দেখাচ্ছে কিনা
expect(find.text('Count: 0'), findsOneWidget);
// বাটনে ট্যাপ করা
await tester.tap(find.byType(ElevatedButton));
await tester.pump();
// চেক করা হচ্ছে যে 'Count: 1' দেখাচ্ছে কিনা
expect(find.text('Count: 1'), findsOneWidget);
});
}
- testWidgets: Widget Test লেখার জন্য ব্যবহার করা হয়।
- WidgetTester: উইজেটের ইন্টারঅ্যাকশন এবং আউটপুট যাচাই করতে সহায়ক।
- pumpWidget: নির্দিষ্ট উইজেটকে রেন্ডার করে।
- find: উইজেট ফাইন্ড করার জন্য ফাংশন, যেমন
find.text('Count: 0')। - tap: একটি বাটন বা ইন্টারঅ্যাক্টেবল উইজেটে ক্লিক বা ট্যাপ করে।
- pump: UI রিফ্রেশ বা রিবিল্ড করে।
Widget Test রান করতে:
flutter test
৩. Integration Tests
Integration Tests সাধারণত অ্যাপ্লিকেশনের বিভিন্ন স্ক্রিন এবং ফিচারগুলোর মধ্যে ইন্টারঅ্যাকশন যাচাই করে। এটি অ্যাপের UI, ফাংশনালিটি এবং বিভিন্ন উপাদানের মধ্যে কিভাবে ইন্টারঅ্যাকশন হচ্ছে তা যাচাই করার জন্য ব্যবহৃত হয়।
Integration Test সেটআপ:
integration_testপ্যাকেজ যুক্ত করুন:
dev_dependencies:
integration_test: ^1.0.0
- Integration Test ফাইল তৈরি করুন:
integration_test/app_test.dart
Integration Test এর উদাহরণ:
import 'package:integration_test/integration_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:your_app/main.dart'; // আপনার মেইন ফাইল
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('full app test', (WidgetTester tester) async {
await tester.pumpWidget(MyApp());
// প্রথমে চেক করা হচ্ছে যে Count: 0 আছে কিনা
expect(find.text('Count: 0'), findsOneWidget);
// বাটনে ক্লিক করা এবং চেক করা Count: 1 দেখাচ্ছে কিনা
await tester.tap(find.byType(ElevatedButton));
await tester.pump();
expect(find.text('Count: 1'), findsOneWidget);
});
}
Integration Test চালানোর জন্য:
flutter drive --target=integration_test/app_test.dart
নোট: Integration Test চালানোর জন্য একটি ইমুলেটর বা ফিজিকাল ডিভাইস সংযুক্ত থাকতে হবে।
Flutter Test Cases লেখার সেরা চর্চা:
- Test Coverage বাড়ান: আপনার কোডের প্রতিটি গুরুত্বপূর্ণ অংশের জন্য টেস্ট লিখুন।
- Test Data তৈরি করুন: বিভিন্ন ধরনের ইনপুট এবং আউটপুট পরীক্ষা করে টেস্ট কেস লিখুন।
- সাধারণ লজিক থেকে শুরু করুন: ইউনিট টেস্ট দিয়ে শুরু করুন এবং পরে Widget এবং Integration Test এ এগিয়ে যান।
- Continuous Integration (CI) ব্যবহার করুন: CI/CD টুলের মাধ্যমে স্বয়ংক্রিয়ভাবে টেস্ট রান করুন, যা প্রোডাকশন রিলিজের আগে বাগ ধরতে সাহায্য করবে।
উপসংহার:
Flutter এ Unit Tests, Widget Tests, এবং Integration Tests এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে ভালোভাবে যাচাই এবং সুরক্ষিত করতে পারেন। নিয়মিত টেস্ট লিখুন এবং টেস্ট কভারেজ বাড়িয়ে তুলুন যাতে আপনার কোড বাগ-মুক্ত থাকে এবং অ্যাপ্লিকেশন সঠিকভাবে কাজ করে।
Read more