Skip to content

Add a level parameter to test runner diagnostics #55922

Description

@avivkeller

maybe we should add a level parameter in diagnostics (i.e debug/info/warn/error) so reporters can implement coloring or other things

Originally posted by @MoLow in #55911 (comment)

Activity

  1. added
    feature requestIssues requesting new Node.js features.
    test_runnerIssues and PRs related to the test runner subsystem.
    on Nov 19, 2024
  2. hpatel292-seneca commented on Nov 20, 2024

    @hpatel292-seneca

    Hi @redyetidev @MoLow, I would love to contribute to this.

  3. avivkeller commented on Nov 20, 2024

    @avivkeller
    MemberAuthor

    Feel free to open a PR

  4. hpatel292-seneca commented on Nov 22, 2024

    @hpatel292-seneca

    Hi @redyetidev, Here is the Summary of Planned changes, please take a look and give feedback

    Summary of Planned Changes

    To address the problem of coverage threshold errors not being visually distinct, I propose the following enhancements:

    1. Introduce a level Parameter in Diagnostics:

      • Add a level parameter (e.g., debug, info, warn, error) to diagnostic messages.
      • This parameter will categorize the severity of the message and allow reporters to handle formatting based on the message type.
    2. Update Diagnostic Emission:

      • Modify the diagnostic function to include the level parameter along with the message and location.
      • Example:
        reporter.diagnostic(nesting, loc, {
          message: `Error: ${actual}% ${name} coverage does not meet threshold of ${threshold}%.`,
          level: 'error'
        });
    3. Delegate Formatting to Reporters:

      • Ensure reporters use the level parameter to apply appropriate formatting (e.g., red for errors, yellow for warnings).
      • This will keep presentation logic within reporters, maintaining the separation of concerns.
  5. pmarchini commented on Nov 22, 2024

    @pmarchini
    Member

    Hey @hpatel292-seneca, thanks for contributing! 😊
    Regarding the planned changes: IMHO, it looks okay🚀 I think you could start working on the PR!

    Only one thing: atm, the message is a string parameter.
    Changing it from a string to an object could require more work and attention, potentially causing breaking changes
    I would suggest considering the idea of simply adding a new parameter to the function instead.

    Just a trivial reminder: please ensure tests are added to cover this feature.

  6. hpatel292-seneca commented on Nov 22, 2024

    @hpatel292-seneca

    Understood. Thanks @pmarchini

  7. hpatel292-seneca commented on Nov 22, 2024

    @hpatel292-seneca

    Hi @pmarchini,

    I just wanted to confirm one thing,
    so I updated the reporter.diagnostic to accept level parameter like this

      diagnostic(nesting, loc, message, level = 'info') {
        this[kEmitMessage]('test:diagnostic', {
          __proto__: null,
          nesting,
          message,
          level,
          ...loc,
        });
      }

    Then I updated #handleEvent like this

     #handleEvent({ type, data }) {
        switch (type) {
          case 'test:fail':
            if (data.details?.error?.failureType !== kSubtestsFailed) {
              ArrayPrototypePush(this.#failedTests, data);
            }
            return this.#handleTestReportEvent(type, data);
          case 'test:pass':
            return this.#handleTestReportEvent(type, data);
          case 'test:start':
            ArrayPrototypeUnshift(this.#stack, { __proto__: null, data, type });
            break;
          case 'test:stderr':
          case 'test:stdout':
            return data.message;
          case 'test:diagnostic':  // Here I added logic
            const diagnosticColor =
              reporterColorMap[data.level] || reporterColorMap['test:diagnostic'];
            return `${diagnosticColor}${indent(data.nesting)}${
              reporterUnicodeSymbolMap[type]
            }${data.message}${colors.white}\n`;
          case 'test:coverage':
            return getCoverageReport(
              indent(data.nesting),
              data.summary,
              reporterUnicodeSymbolMap['test:coverage'],
              colors.blue,
              true
            );
        }
      }

    And I am Updated reporterColorMap like this

    const reporterColorMap = {
      __proto__: null,
      get 'test:fail'() {
        return colors.red;
      },
      get 'test:pass'() {
        return colors.green;
      },
      get 'test:diagnostic'() {
        return colors.blue;
      },
      get info() {
        return colors.blue;
      },
      get debug() {
        return colors.gray;
      },
      get warn() {
        return colors.yellow;
      },
      get error() {
        return colors.red;
      },
    };

    and color already contain logic for this colors

    so my question is I will set the reporter.diagnostic call from test.js like this (level="Error")

    if (actual < threshold) {
                harness.success = false;
                process.exitCode = kGenericUserError;
                reporter.diagnostic(
                  nesting,
                  loc,
                  `Error: ${NumberPrototypeToFixed(
                    actual,
                    2
                  )}% ${name} coverage does not meet threshold of ${threshold}%.`,
                  'error'  // Level is set to error for red color
                );
              }

    right?

  8. pmarchini commented on Nov 22, 2024

    @pmarchini
    Member

    Hey @hpatel292-seneca, I would suggest moving this discussion to a draft PR!

    Also, please include at least some tests (even in the draft) to verify the behavior 🚀

  9. hpatel292-seneca commented on Nov 22, 2024

    @hpatel292-seneca

    Hi @pmarchini, I am confused, I read Building.md but not sure what option is best for me to build Node. I have windows. Could you please let me know what is best option to build Node locally for Windows.

    Thanks

  10. pmarchini commented on Nov 22, 2024

    @pmarchini
    Member

    Hi @pmarchini, I am confused, I read Building.md but not sure what option is best for me to build Node. I have windows. Could you please let me know what is best option to build Node locally for Windows.

    Thanks

    I would suggest going with option 3: Boxstarter 🚀

  11. hpatel292-seneca commented on Nov 22, 2024

    @hpatel292-seneca

    @pmarchini How much time do you think the build will take?
    Because my building has been running for 1 hour and 10 minutes and still hasn't been completed.

  12. pmarchini commented on Nov 22, 2024

    @pmarchini
    Member

    @hpatel292-seneca it greatly depends on your machine.
    On my Windows laptop it takes circa 25 minutes

  13. 19 remaining items

  14. github-actions commented on Jun 11, 2025

    @github-actions
    Contributor

    There has been no activity on this feature request for 5 months. To help maintain relevant open issues, please add the never-stale Issues and PRs exempt from automated stale handling. label or close this issue if it should be closed. If not, the issue will be automatically closed 6 months after the last non-automated comment.
    For more information on how the project manages feature requests, please consult the feature request management document.

  15. added
    staleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.
    on Jun 11, 2025
  16. removed
    staleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.
    on Jun 11, 2025
  17. pmarchini commented on Jun 11, 2025

    @pmarchini
    Member

    Resolved by #57923

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    feature requestIssues requesting new Node.js features.test_runnerIssues and PRs related to the test runner subsystem.

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions