Added a check to the analyzer script to detect skipped tests. (#88003)
Added a check to the analyzer script to detect skipped tests that aren't commented. The comment following the `skip` parameter should include either a link to a github issue tracking the reenabling of the test, or a '[intended]' tag with a brief description of why the test should never be enabled for the given condition.
This commit is contained in:
parent
b08366ce7b
commit
41ff30c871
@ -60,6 +60,9 @@ Future<void> run(List<String> arguments) async {
|
|||||||
print('$clock Deprecations...');
|
print('$clock Deprecations...');
|
||||||
await verifyDeprecations(flutterRoot);
|
await verifyDeprecations(flutterRoot);
|
||||||
|
|
||||||
|
print('$clock Skip test comments...');
|
||||||
|
await verifySkipTestComments(flutterRoot);
|
||||||
|
|
||||||
print('$clock Licenses...');
|
print('$clock Licenses...');
|
||||||
await verifyNoMissingLicense(flutterRoot);
|
await verifyNoMissingLicense(flutterRoot);
|
||||||
|
|
||||||
@ -280,6 +283,38 @@ Future<void> _verifyNoMissingLicenseForExtension(String workingDirectory, String
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final RegExp _skipTestCommentPattern = RegExp(r'\bskip:.*?//(.*)');
|
||||||
|
const Pattern _skipTestIntentionalPattern = '[intended]';
|
||||||
|
final Pattern _skipTestTrackingBugPattern = RegExp(r'https+?://github.com/.*/issues/[0-9]+');
|
||||||
|
|
||||||
|
Future<void> verifySkipTestComments(String workingDirectory) async {
|
||||||
|
final List<String> errors = <String>[];
|
||||||
|
final Stream<File> testFiles = _allFiles(workingDirectory, 'dart', minimumMatches: 1500)
|
||||||
|
.where((File f) => f.path.endsWith('_test.dart'));
|
||||||
|
|
||||||
|
await for (final File file in testFiles) {
|
||||||
|
final List<String> lines = file.readAsLinesSync();
|
||||||
|
for (int index = 0; index < lines.length; index++) {
|
||||||
|
final Match? match = _skipTestCommentPattern.firstMatch(lines[index]);
|
||||||
|
final String? skipComment = match?.group(1);
|
||||||
|
if (skipComment != null
|
||||||
|
&& !skipComment.contains(_skipTestIntentionalPattern)
|
||||||
|
&& !skipComment.contains(_skipTestTrackingBugPattern)) {
|
||||||
|
final int sourceLine = index + 1;
|
||||||
|
errors.add('${file.path}:$sourceLine}: skip test without a justification comment.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fail if any errors
|
||||||
|
if (errors.isNotEmpty) {
|
||||||
|
exitWithError(<String>[
|
||||||
|
...errors,
|
||||||
|
'\n${bold}See: https://github.com/flutter/flutter/wiki/Tree-hygiene#skipped-tests$reset',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final RegExp _testImportPattern = RegExp(r'''import (['"])([^'"]+_test\.dart)\1''');
|
final RegExp _testImportPattern = RegExp(r'''import (['"])([^'"]+_test\.dart)\1''');
|
||||||
const Set<String> _exemptTestImports = <String>{
|
const Set<String> _exemptTestImports = <String>{
|
||||||
'package:flutter_test/flutter_test.dart',
|
'package:flutter_test/flutter_test.dart',
|
||||||
|
@ -58,7 +58,7 @@ Future<double> findCostsForFile(File file) async {
|
|||||||
total += deprecationCost;
|
total += deprecationCost;
|
||||||
if (line.contains(legacyDeprecationPattern))
|
if (line.contains(legacyDeprecationPattern))
|
||||||
total += legacyDeprecationCost;
|
total += legacyDeprecationCost;
|
||||||
if (isTest && line.contains('skip:'))
|
if (isTest && line.contains('skip:') && !line.contains('[intended]'))
|
||||||
total += skipCost;
|
total += skipCost;
|
||||||
if (isDart && isOptingOutOfNullSafety(line))
|
if (isDart && isOptingOutOfNullSafety(line))
|
||||||
total += fileNullSafetyMigrationCost;
|
total += fileNullSafetyMigrationCost;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user