Search code examples
cypress

how to have nested log groups?


I can structure logs into a collapsible group using groupStart and groupEnd (see e. g. github).

Cypress.log({name,
             message,
             groupStart: true,
            })

Is there a way to nest such groups into a collapsible super group?


Solution

  • You will notice there's also a groupEnd property which is implicit at the end of the test.

    Using groupEnd explicitly, it's fairly trivial to nest groups.

    It behaves identically to console.group

    it('log nesting', () => {
      Cypress.log({ name: 'level1', message: '+ grouping', groupStart: true })
      Cypress.log({ name: 'level2', message: '+ grouping', groupStart: true })
      Cypress.log({ name: 'level3', message: '+ grouping', groupStart: true })
    
      Cypress.log({ name: 'inner', message: 'inside nested groups'})
    
      Cypress.log({ name: 'level3', message: '- grouping', groupEnd: true })
      Cypress.log({ name: 'level2', message: '- grouping', groupEnd: true })
      Cypress.log({ name: 'level1', message: '- grouping', groupEnd: true })
    })
    

    enter image description here


    Without the un-nesting log entries

    Call the .endGroup() method on the saved log variable to reduce the nesting level.

    it('log nesting', () => {
      const level1Log = Cypress.log({ name: 'level1', message: '+ grouping', groupStart: true })
      const level2Log = Cypress.log({ name: 'level2', message: '+ grouping', groupStart: true })
      const level3Log = Cypress.log({ name: 'level3', message: '+ grouping', groupStart: true })
    
      Cypress.log({ name: 'inner', message: 'inside nested groups'})
    
      level3Log.endGroup()
      Cypress.log({ name: 'outer2', message: 'outside level 3'})
    
      const level3aLog = Cypress.log({ name: 'level3a', message: '+ grouping', groupStart: true })
    
      Cypress.log({ name: 'inner', message: 'inside level 3a group'})
      level3aLog.endGroup()
    
      level2Log.endGroup()
      Cypress.log({ name: 'outer1', message: 'outside level 2'})
    
      level1Log.endGroup()
      Cypress.log({ name: 'outer', message: 'outside all nested groups'})
    })
    

    enter image description here


    Typescript

    If you are concerned about these options being omitted from the type definition, add a .d.ts file to the project to make them publicly available.

    declare namespace Cypress {
      interface LogConfig {
        groupStart: Boolean
        groupEnd: Boolean
      }
    
      interface Log { 
        endGroup(): void
      }
    }