Flutter TestRail集成插件flutter_testrail的使用
Flutter TestRail 集成插件 flutter_testrail 的使用
Flutter TestRail
此软件包提供了 Dart 接口,以便与 TestRail API 进行无缝集成,从而实现自动化测试报告,包括测试运行管理和用例通过/失败报告。
开始使用
初始化 TestRail 实例使用 configure
方法:
FlutterTestRail.initialize(
username: '你的用户名',
password: '你的密码',
/// 指向 TestRail 服务器的 URL => https://example.testrail.com
serverDomain: 'https://example.testrail.com',
);
使用方法
添加结果
添加新的测试结果、评论或分配测试。如果你计划为多个测试添加结果,建议使用 Add Result
方法。
final testResult = await TestResult.addTestResult(9, statusId: 1); // 替换 9 为你的测试 ID。
批量添加结果
批量添加一个或多个新的测试结果、评论或分配一个或多个测试。适合用于自动化测试以一次性批量添加多个测试结果。
List<TestStatus> testStatusResult = [
TestStatus(caseId: 121, statusId: 1, comment: '第一个测试通过了'),
TestStatus(caseId: 122, statusId: 5, comment: '第二个测试失败')
];
final testResult = await TestResult.addRunResults(3, addTestResults: testStatusResult); // 替换 3 为你的运行 ID。
通过案例 ID 批量添加结果
通过案例 ID 批量添加一个或多个新的测试结果、评论或分配一个或多个测试。适合用于自动化测试以一次性批量添加多个测试结果。
/// 创建你的初始测试状态列表。
List<TestStatus> testStatusResults = [
TestStatus(
caseId: 1758,
statusId: 3,
comment: '验证用户是否能看到启动屏幕',
),
TestStatus(
caseId: 1759,
statusId: 3,
comment: '验证在启动屏幕后,用户是否能看到“权限屏幕”',
),
];
/// 更新你的列表,在测试完成后将状态更新到 TestRail。
await TestRailUtil.reportMultipleTestCaseResults(testStatusResults);
class TestRailUtil {
static void configureTestRail() {
HttpOverrides.global = MyHttpOverrides();
FlutterTestRail.initialize(
username: '你的用户名',
password: '你的密码',
serverDomain: 'https://example.testrail.com',
);
}
/// 将单个测试结果报告到 TestRail [reportSingleTestCaseResult],
///
/// 相应的状态码:
/// 1: 通过
/// 2: 阻塞
/// 3: 未测试(不允许在添加新结果时使用)
/// 4: 重新测试
/// 5: 失败
///
/// 因此根据你的测试状态传递相应的状态码。
static Future<void> reportSingleTestCaseResult({
required int testCaseId,
required int testStatusId,
String? comment,
String? elapsed,
}) async {
final testRun = await TestRun.get(3);
await testRun.addResultForCase(
testCaseId,
statusId: testStatusId,
comment: comment ?? '评论',
elapsed: elapsed,
);
}
/// 将多个测试结果报告到 TestRail [reportMultipleTestCaseResults],
///
/// 相应的状态码:
/// 1: 通过
/// 2: 阻塞
/// 3: 未测试(不允许在添加新结果时使用)
/// 4: 重新测试
/// 5: 失败
///
/// 因此根据你的测试状态传递相应的状态码。
static Future<void> reportMultipleTestCaseResults(
List<TestStatus> testStatusResults,
) async {
final testRun = await TestRun.get(3);
await testRun.addResultsForCases(
testStatusResults,
);
}
static List<TestStatus> getUpdatedTestStatusList({
required List<TestStatus> testStatusResults,
required int caseId,
required int statusId,
}) {
final updatedTestStatusResults = testStatusResults.map((testStatus) {
if (testStatus.caseId == caseId) {
return TestStatus(
caseId: testStatus.caseId,
statusId: statusId,
comment: testStatus.comment,
);
}
return testStatus;
}).toList();
return updatedTestStatusResults;
}
}
class MyHttpOverrides extends HttpOverrides {
[@override](/user/override)
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
创建测试用例
在特定的章节中创建新的测试用例。
/// 在指定的章节中创建新的测试用例
final createdTestCase = await TestCase.create(
// 替换为你自己的章节 ID
1,
title: 'API 创建的测试用例',
customValues: <String, dynamic>{
// 自定义字段以 "custom_" 前缀开始
'custom_feedback': '这是自定义反馈',
},
);
删除测试用例
通过 ID 获取并删除测试用例。
/// 通过 ID 获取测试用例
final testCase = await TestCase.get(1);
await testCase.delete();
创建或更新运行
首先创建一个新的运行。
/// 首先创建一个新的运行
final newRun = await TestRun.create(
name: '测试执行',
projectId: 1,
);
/// 向运行中添加用例
await newRun.updateRun(
caseIds: [1, 2, 3, 5],
);
一旦运行创建完成,可以通过用例 ID 报告结果:
final result = await newRun.addResultForCase(
caseId: 1,
statusId: 1,
);
// 可选地向结果中添加截图或其他图像
await result.addAttachment(
'/workspace/attachments/failure.png',
);
获取信息
可以获取历史运行、用例和章节:
final testCase = await TestCase.get(1);
final testCases = await TestCase.getAll(1);
final testRun = await TestRun.get(1);
final testSection = await TestSection.get(1);
final testCaseHistory = await TestCaseHistory.get(1);
可以获取已完成或正在进行的测试运行结果:
final caseResults = await TestResult.getCaseResults(
// 用例 ID 来自 TestCases,而不是 TestRun
184234,
runId: 1833,
);
final runResults = await TestResult.getRunResults(
1818,
statusId: [5, 1],
);
final testResults = await TestResult.getTestResults(
// 特定 TestRun 中的测试 ID
1868150,
);
完整示例
import 'dart:io';
import 'package:flutter_testrail/flutter_testrail.dart';
import 'package:flutter_test/flutter_test.dart';
import 'myapp.dart';
Future<void> main() async {
setUpAll(() async {
TestRailUtil.configureTestRail();
});
List<TestStatus> testStatusResults = [
TestStatus(
caseId: 1758,
statusId: 3,
comment: '验证用户是否能看到启动屏幕',
),
TestStatus(
caseId: 1759,
statusId: 3,
comment: '验证在启动屏幕后,用户是否能看到“权限屏幕”',
),
];
tearDownAll(() async {
/// 在最后更新我们的测试状态到 TestRail。
await TestRailUtil.reportMultipleTestCaseResults(testStatusResults);
});
group('测试权限流', () {
testWidgets(
'授予权限',
(tester) async {
testStatusResults = TestRailUtil.getUpdatedTestStatusList(
caseId: 1759,
statusId: 5,
testStatusResults: testStatusResults,
);
/// 泵送你的小部件。
tester.pumpWidget(MyApp());
await tester.pumpAndSettle(const Duration(seconds: 5));
/// 查找预期的文本。
expect(find.text('文本'), findsOneWidget);
await tester.pumpAndSettle();
/// 一旦测试通过,更新初始测试列表。
testStatusResults = TestRailUtil.getUpdatedTestStatusList(
caseId: 1761,
statusId: 1,
testStatusResults: testStatusResults,
);
},
);
});
}
class TestRailUtil {
static void configureTestRail() {
HttpOverrides.global = MyHttpOverrides();
FlutterTestRail.initialize(
username: '你的用户名',
password: '你的密码',
serverDomain: 'https://example.testrail.com',
);
}
/// 将单个测试结果报告到 TestRail [reportSingleTestCaseResult],
///
/// 相应的状态码:
/// 1: 通过
/// 2: 阻塞
/// 3: 未测试(不允许在添加新结果时使用)
/// 4: 重新测试
/// 5: 失败
///
/// 因此根据你的测试状态传递相应的状态码。
static Future<void> reportSingleTestCaseResult({
required int testCaseId,
required int testStatusId,
String? comment,
String? elapsed,
}) async {
final testRun = await TestRun.get(3);
await testRun.addResultForCase(
testCaseId,
statusId: testStatusId,
comment: comment ?? '评论',
elapsed: elapsed,
);
}
/// 将多个测试结果报告到 TestRail [reportMultipleTestCaseResults],
///
/// 相应的状态码:
/// 1: 通过
/// 2: 阻塞
/// 3: 未测试(不允许在添加新结果时使用)
/// 4: 重新测试
/// 5: 失败
///
/// 因此根据你的测试状态传递相应的状态码。
static Future<void> reportMultipleTestCaseResults(
List<TestStatus> testStatusResults,
) async {
final testRun = await TestRun.get(3);
await testRun.addResultsForCases(
testStatusResults,
);
}
static List<TestStatus> getUpdatedTestStatusList({
required List<TestStatus> testStatusResults,
required int caseId,
required int statusId,
}) {
final updatedTestStatusResults = testStatusResults.map((testStatus) {
if (testStatus.caseId == caseId) {
return TestStatus(
caseId: testStatus.caseId,
statusId: statusId,
comment: testStatus.comment,
);
}
return testStatus;
}).toList();
return updatedTestStatusResults;
}
}
class MyHttpOverrides extends HttpOverrides {
[@override](/user/override)
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
更多关于Flutter TestRail集成插件flutter_testrail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter TestRail集成插件flutter_testrail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中集成和使用flutter_testrail
插件的示例代码。flutter_testrail
插件允许你与TestRail API进行交互,从而管理测试用例、结果等。
首先,确保你已经在你的Flutter项目中添加了flutter_testrail
依赖。你可以在pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
flutter_testrail: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来获取依赖。
接下来,你需要配置TestRail的API凭证和URL。通常,这些信息会存储在你的应用的配置文件或环境变量中。
以下是一个示例代码,展示了如何使用flutter_testrail
插件来获取一个测试用例的详细信息:
import 'package:flutter/material.dart';
import 'package:flutter_testrail/flutter_testrail.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
TestRailClient? _testRailClient;
TestCase? _testCase;
@override
void initState() {
super.initState();
// 配置TestRail客户端
_configureTestRailClient();
}
void _configureTestRailClient() {
// 替换为你的TestRail URL, 用户名, 密码和项目ID
final String testRailUrl = 'https://your-testrail-url.com/';
final String username = 'your-username';
final String password = 'your-password';
final int projectId = 1; // 你的项目ID
_testRailClient = TestRailClient(
baseUrl: testRailUrl,
username: username,
password: password,
);
// 获取一个测试用例的详细信息 (替换为实际的用例ID)
final int caseId = 123; // 替换为实际的测试用例ID
_testRailClient!.getCase(projectId, caseId).then((testCase) {
setState(() {
_testCase = testCase;
});
}).catchError((error) {
print('Error fetching test case: $error');
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter TestRail Integration'),
),
body: Center(
child: _testCase == null
? CircularProgressIndicator()
: Text('Test Case Title: ${_testCase!.title}'),
),
),
);
}
}
class TestRailClient {
final String baseUrl;
final String username;
final String password;
final http.Client _httpClient = http.Client();
TestRailClient({required this.baseUrl, required this.username, required this.password});
Future<TestCase> getCase(int projectId, int caseId) async {
final String auth = 'Basic ${base64Encode(utf8.encode('$username:$password'))}';
final Uri url = Uri.parse('$baseUrl/index.php?/api/v2/get_case/$projectId/$caseId');
final http.Response response = await _httpClient.get(
url,
headers: <String, String>{
'Authorization': auth,
'Content-Type': 'application/json',
},
);
if (response.statusCode == 200) {
final Map<String, dynamic> jsonData = jsonDecode(response.body);
return TestCase.fromJson(jsonData['case']);
} else {
throw Exception('Failed to fetch test case: ${response.statusCode}');
}
}
}
class TestCase {
int id;
String title;
// 添加其他需要的字段
TestCase({required this.id, required this.title});
factory TestCase.fromJson(Map<String, dynamic> json) {
return TestCase(
id: json['id'] as int,
title: json['title'] as String,
// 添加其他字段的解析
);
}
}
注意:
- 上面的代码示例假设TestRail API返回的数据格式符合预期的JSON结构。你可能需要根据实际的API响应调整
TestCase
类的字段和fromJson
方法。 - 使用Basic Auth进行认证,你可能需要考虑更安全的认证方式,如OAuth或API密钥。
- 在实际项目中,请确保敏感信息(如API凭证)不会被硬编码在代码中,而是使用环境变量或安全存储机制。
- 示例代码中的
http
库是Dart的标准库,无需额外添加依赖。
这个示例展示了如何配置TestRail客户端,并通过API获取一个测试用例的详细信息。你可以根据需求扩展这个示例,添加更多与TestRail交互的功能。