Testing Frameworks like Vitest, Jest and Jasmine provide a describe() function. It is useful to group your tests into logical groups. The function can be nested to create a hierarchy of tests and make the tests more readable.

In Angular for example, you will have the following spec file when creating a new component:

TypeScript
describe("AccordionComponent", () => {
  it("should create", () => {
    // ...
  });
});

Instead of adding a lot of it() calls with long descriptions you can create multiple describe() blocks.

TypeScript
describe("AccordionComponent", () => {
  describe("initial state is expanded", () => {
    // Mock data, test utils, etc. for this describe() block
    const initiallyExpanded = true;

    it("should render the accordion title", () => {
      // ...
    });

    it("should render the accordion content", () => {
      // ...
    });

    it("should mark the accordion as expanded", () => {
      // ...
    });

    it("should collapse the accordion when clicking on the title", () => {
      // ...
    });
  });

  describe("initial state is collapsed", () => {
    it("should render the accordion title", () => {
      // ...
    });

    it("should not render the accordion content", () => {
      // ...
    });

    it("should mark the accordion as collapsed", () => {
      // ...
    });

    it("should expand the accordion when clicking on the title", () => {
      // ...
    });
  });
});

Jasmine shows all describe() blocks in the output and nests them in a tree structure.

Jasmine shows all nested describe blocks