Flutter TestRail集成插件flutter_testrail的使用

发布于 1周前 作者 songsunli 来自 Flutter

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

1 回复

更多关于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,
      // 添加其他字段的解析
    );
  }
}

注意

  1. 上面的代码示例假设TestRail API返回的数据格式符合预期的JSON结构。你可能需要根据实际的API响应调整TestCase类的字段和fromJson方法。
  2. 使用Basic Auth进行认证,你可能需要考虑更安全的认证方式,如OAuth或API密钥。
  3. 在实际项目中,请确保敏感信息(如API凭证)不会被硬编码在代码中,而是使用环境变量或安全存储机制。
  4. 示例代码中的http库是Dart的标准库,无需额外添加依赖。

这个示例展示了如何配置TestRail客户端,并通过API获取一个测试用例的详细信息。你可以根据需求扩展这个示例,添加更多与TestRail交互的功能。

回到顶部