realm/SwiftLint

JUnit Reporter Missing Test Count

已关闭

#6,161 创建于 2025年7月11日

 (3 条评论) (0 个反应) (0 位负责人)Swift (2,295 个派生)batch import
enhancementgood first issue

仓库指标

星标
 (19,570 个星标)
PR 合并指标
 (PR 指标待抓取)

描述

New Issue Checklist

Bug Description

Coming out of PR #4725 updates were made to enhance the JUnit reporting with additional details that are necessary for some pipeline engines; specifically Bitbucket.

Unfortunately, one aspect of that PR was seemingly dropped, namely the "total tests count" which we're finding appears to be a requirement for Bitbucket ingestion in particular. For example, we're getting this message as Bitbucket's JUnit parsing logic:

Merged test suites, total number tests is 0, with 0 failures and 2 errors.

While it properly detects the presence of failures/errors per that referenced PR's changes; it's detecting 0 tests which we believe it causing them to disable all their UI integrations for reporting from this file.

The JUnit Complete Reference Example shows this as simply adding a "tests" attribute to both "testsuites" and "testsuite" XML nodes.

Additionally, I suspect the "testsuite" XML nodes need a "name" property for effective rendering. Most other tools I've seen (e.g. eslint in the Javascript world) would populate this simply as the filename though depending on how Swiftlint marshals this file maybe the linting rule is more appropriate or even just a single "SwiftLint" name if everything is marshalled under a single "testsuite".

Environment

  • SwiftLint version: 0.59.1
  • Xcode version: 16.4 Build 16F6
  • Installation method used: Homebrew
  • Configuration file:
disabled_rules:
  - file_length
  - function_body_length
  - line_length
  - type_body_length

opt_in_rules:
  - conditional_returns_on_newline
  - contains_over_filter_count
  - contains_over_filter_is_empty
  - contains_over_first_not_nil
  - contains_over_range_nil_comparison
  - empty_collection_literal
  - empty_string
  - explicit_init
  - fatal_error_message
  - first_where
  - flatmap_over_map_reduce
  - identical_operands
  - implicit_return
  - joined_default_parameter
  - last_where
  - legacy_multiple
  - let_var_whitespace
  - multiline_function_chains
  - multiline_literal_brackets
  - object_literal
  - optional_enum_case_matching
  - prefer_self_in_static_references
  - prefer_self_type_over_type_of_self
  - prefer_zero_over_explicit_init
  - reduce_into
  - redundant_nil_coalescing
  - redundant_type_annotation
  - return_value_from_void_function
  - sorted_first_last
  - static_operator
  - toggle_bool
  - trailing_closure
  - unavailable_function
  - untyped_error_in_catch
  - xct_specific_matcher

conditional_returns_on_newline:
  if_only: true

opening_brace:
  ignore_multiline_statement_conditions: true

identifier_name:
  min_length:
    warning: 0
    error: 0
  max_length:
    warning: 9999
    error: 9999
  unallowed_symbols_severity: warning
  validates_start_with_lowercase: warning

type_name:
  max_length:
    warning: 60

Are you using nested configurations? If so, paste their relative paths and respective contents.

Not applicable

贡献者指南