diff --git a/.eslintrc.js b/.eslintrc.js
index 7b963dad11b1c4021de36adc7251bcb635938444..c9138b5c43f497fead2465087d6017de86cab9fc 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -3,6 +3,7 @@ module.exports = {
   env: {
     node: true,
   },
+  plugins: ['@renovate'],
   extends: [
     'airbnb-typescript/base',
     'plugin:import/errors',
@@ -105,6 +106,7 @@ module.exports = {
 
     '@typescript-eslint/unbound-method': 2,
     '@typescript-eslint/ban-types': 2,
+    '@renovate/jest-root-describe': 2,
   },
   settings: {
     'import/parsers': {
diff --git a/lib/config/decrypt.spec.ts b/lib/config/decrypt.spec.ts
index a3045bb6f6bb0f25b500fa3d06e701d22c3e041b..7466e0a8cbc35a2ae3d97a9ab4adb53bca4f31e4 100644
--- a/lib/config/decrypt.spec.ts
+++ b/lib/config/decrypt.spec.ts
@@ -1,11 +1,11 @@
-import { getName, loadFixture } from '../../test/util';
+import { loadFixture } from '../../test/util';
 import { decryptConfig } from './decrypt';
 import { setGlobalConfig } from './global';
 import type { RenovateConfig } from './types';
 
 const privateKey = loadFixture('private.pem', '.');
 
-describe(getName(), () => {
+describe('config/decrypt', () => {
   describe('decryptConfig()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/config/index.spec.ts b/lib/config/index.spec.ts
index 73744b497e91e26da59b8e97897204a200b0481a..f0ab843c78e13cef36eaadceb9b1ce2351768d83 100644
--- a/lib/config/index.spec.ts
+++ b/lib/config/index.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../test/util';
 import { getConfig } from './defaults';
 
 jest.mock('../datasource/npm');
@@ -10,7 +9,7 @@ try {
 
 const defaultConfig = getConfig();
 
-describe(getName(), () => {
+describe('config/index', () => {
   describe('mergeChildConfig(parentConfig, childConfig)', () => {
     it('merges', async () => {
       const parentConfig = { ...defaultConfig };
diff --git a/lib/config/massage.spec.ts b/lib/config/massage.spec.ts
index c8a44eb84a5b3e7b414db40e5da7889821056584..d952354cd8bbe3ec01d13789b8983caee81bf501 100644
--- a/lib/config/massage.spec.ts
+++ b/lib/config/massage.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../test/util';
 import * as massage from './massage';
 import type { RenovateConfig } from './types';
 
-describe(getName(), () => {
+describe('config/massage', () => {
   describe('massageConfig', () => {
     it('returns empty', () => {
       const config: RenovateConfig = {};
diff --git a/lib/config/migrate-validate.spec.ts b/lib/config/migrate-validate.spec.ts
index 5fd350a01ed8fedb1d6f6ebce112dbc9a10e6681..c6c40f7004571b519320ae4875e749a0b3fb92a0 100644
--- a/lib/config/migrate-validate.spec.ts
+++ b/lib/config/migrate-validate.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName } from '../../test/util';
+import { RenovateConfig, getConfig } from '../../test/util';
 import { migrateAndValidate } from './migrate-validate';
 
 let config: RenovateConfig;
@@ -7,7 +7,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('config/migrate-validate', () => {
   describe('migrateAndValidate()', () => {
     it('handles empty', async () => {
       const res = await migrateAndValidate(config, {});
diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index 890d566e63611820a05207bf1d94c9c04857bbe4..08bb570a5074e3265f353bd444f329af74f57e88 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../test/util';
 import { PLATFORM_TYPE_GITHUB } from '../constants/platforms';
 import { getConfig } from './defaults';
 import { setGlobalConfig } from './global';
@@ -15,7 +14,7 @@ interface TestRenovateConfig extends RenovateConfig {
   node?: RenovateSharedConfig;
 }
 
-describe(getName(), () => {
+describe('config/migration', () => {
   describe('migrateConfig(config, parentConfig)', () => {
     it('migrates config', () => {
       const config: TestRenovateConfig = {
diff --git a/lib/config/options/index.spec.ts b/lib/config/options/index.spec.ts
index 40d6c677caf68a01692b1404263608bf0cc29f14..c24d6d4bdba30c92ce06b482a6c8efe78f199d5a 100644
--- a/lib/config/options/index.spec.ts
+++ b/lib/config/options/index.spec.ts
@@ -1,11 +1,10 @@
-import { getName } from '../../../test/util';
 import { getOptions } from '.';
 
 jest.mock('../../manager', () => ({
   getManagers: jest.fn(() => new Map().set('testManager', {})),
 }));
 
-describe(getName(), () => {
+describe('config/options/index', () => {
   it('test manager should have no defaultConfig', () => {
     const opts = getOptions();
     expect(opts.filter((o) => o.name === 'testManager')).toEqual([]);
diff --git a/lib/config/presets/azure/index.spec.ts b/lib/config/presets/azure/index.spec.ts
index 3c7e8467aaa54dd039cd5de6c9b4efd9da2568a1..5d00d0d365b5c91708bb8e1f2348e78ac8faa4d8 100644
--- a/lib/config/presets/azure/index.spec.ts
+++ b/lib/config/presets/azure/index.spec.ts
@@ -1,5 +1,5 @@
 import { Readable } from 'stream';
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import { setPlatformApi } from '../../../platform';
 import * as _azureApi from '../../../platform/azure/azure-got-wrapper';
 import { PRESET_DEP_NOT_FOUND, PRESET_INVALID_JSON } from '../util';
@@ -10,7 +10,7 @@ jest.mock('../../../platform/azure/azure-got-wrapper');
 
 const azureApi = mocked(_azureApi);
 
-describe(getName(), () => {
+describe('config/presets/azure/index', () => {
   beforeAll(() => {
     setPlatformApi('azure');
   });
diff --git a/lib/config/presets/bitbucket-server/index.spec.ts b/lib/config/presets/bitbucket-server/index.spec.ts
index a6f0c8661127d68b98b7364444d0150306e527f7..9e98bd0115024330fe7c638cd831602ddb953be1 100644
--- a/lib/config/presets/bitbucket-server/index.spec.ts
+++ b/lib/config/presets/bitbucket-server/index.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import * as _hostRules from '../../../util/host-rules';
 import { PRESET_DEP_NOT_FOUND, PRESET_INVALID_JSON } from '../util';
 import * as bitbucketServer from '.';
@@ -11,7 +11,7 @@ const hostRules = mocked(_hostRules);
 const bitbucketApiHost = 'https://git.company.org';
 const basePath = '/rest/api/1.0/projects/some/repos/repo/browse';
 
-describe(getName(), () => {
+describe('config/presets/bitbucket-server/index', () => {
   beforeEach(() => {
     hostRules.find.mockReturnValue({ token: 'abc' });
   });
diff --git a/lib/config/presets/bitbucket/index.spec.ts b/lib/config/presets/bitbucket/index.spec.ts
index 7a69e16f7e6cbef6a631af9bf1eb6c8cf88fdafa..d7d1144d75c5a8a1b4b11734a8f482ad7261a3fe 100644
--- a/lib/config/presets/bitbucket/index.spec.ts
+++ b/lib/config/presets/bitbucket/index.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName } from '../../../../test/util';
 import { setPlatformApi } from '../../../platform';
 import { PRESET_DEP_NOT_FOUND, PRESET_INVALID_JSON } from '../util';
 import * as bitbucket from '.';
@@ -9,7 +8,7 @@ jest.unmock('../../../platform');
 const baseUrl = 'https://api.bitbucket.org';
 const basePath = '/2.0/repositories/some/repo/src/HEAD';
 
-describe(getName(), () => {
+describe('config/presets/bitbucket/index', () => {
   beforeAll(() => {
     setPlatformApi('bitbucket');
   });
diff --git a/lib/config/presets/gitea/index.spec.ts b/lib/config/presets/gitea/index.spec.ts
index 213b77ad6eccc24087e4daa7122a5dd15a14baf9..c9394a3a6632c976ad3c8ff081b842e79fe6a56d 100644
--- a/lib/config/presets/gitea/index.spec.ts
+++ b/lib/config/presets/gitea/index.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import * as _hostRules from '../../../util/host-rules';
 import { setBaseUrl } from '../../../util/http/gitea';
 import { PRESET_INVALID_JSON, PRESET_NOT_FOUND } from '../util';
@@ -12,7 +12,7 @@ const hostRules = mocked(_hostRules);
 const giteaApiHost = gitea.Endpoint;
 const basePath = '/repos/some/repo/contents';
 
-describe(getName(), () => {
+describe('config/presets/gitea/index', () => {
   beforeEach(() => {
     hostRules.find.mockReturnValue({ token: 'abc' });
     setBaseUrl(giteaApiHost);
diff --git a/lib/config/presets/github/index.spec.ts b/lib/config/presets/github/index.spec.ts
index 79fc22a514e5d75c885af2342c700ff9de67d818..1ae4e70822a91ce7caab447902e8b43902a52202 100644
--- a/lib/config/presets/github/index.spec.ts
+++ b/lib/config/presets/github/index.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import * as _hostRules from '../../../util/host-rules';
 import { PRESET_INVALID_JSON, PRESET_NOT_FOUND } from '../util';
 import * as github from '.';
@@ -11,7 +11,7 @@ const hostRules = mocked(_hostRules);
 const githubApiHost = github.Endpoint;
 const basePath = '/repos/some/repo/contents';
 
-describe(getName(), () => {
+describe('config/presets/github/index', () => {
   beforeEach(() => {
     hostRules.find.mockReturnValue({ token: 'abc' });
   });
diff --git a/lib/config/presets/gitlab/index.spec.ts b/lib/config/presets/gitlab/index.spec.ts
index b100dc70f5efcb0740848f5636b9c9c509f12def..1ba88176c663a2fc2685ac2d6c01a8090b14d695 100644
--- a/lib/config/presets/gitlab/index.spec.ts
+++ b/lib/config/presets/gitlab/index.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName } from '../../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../../constants/error-messages';
 import { PRESET_DEP_NOT_FOUND } from '../util';
 import * as gitlab from '.';
@@ -7,7 +6,7 @@ import * as gitlab from '.';
 const gitlabApiHost = 'https://gitlab.com';
 const basePath = '/api/v4/projects/some%2Frepo/repository';
 
-describe(getName(), () => {
+describe('config/presets/gitlab/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
   });
diff --git a/lib/config/presets/index.spec.ts b/lib/config/presets/index.spec.ts
index 7d0782489a616e9d0caa50e983b0dba7bcdfe534..7c2032397947d4672981efdc079bd177e888a26c 100644
--- a/lib/config/presets/index.spec.ts
+++ b/lib/config/presets/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadJsonFixture, mocked } from '../../../test/util';
+import { loadJsonFixture, mocked } from '../../../test/util';
 import type { RenovateConfig } from '../types';
 import * as _local from './local';
 import * as _npm from './npm';
@@ -39,7 +39,7 @@ npm.getPreset = jest.fn(({ packageName, presetName }) => {
   return null;
 });
 
-describe(getName(), () => {
+describe('config/presets/index', () => {
   describe('resolvePreset', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/config/presets/internal/index.spec.ts b/lib/config/presets/internal/index.spec.ts
index 0e018bdda8ebfc7db0998f5f32bd10c9aec7f116..16ea856ad9d5b13a7d0ed600e9585ec0677f9302 100644
--- a/lib/config/presets/internal/index.spec.ts
+++ b/lib/config/presets/internal/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import { CONFIG_VALIDATION } from '../../../constants/error-messages';
 import { massageConfig } from '../../massage';
 import { validateConfig } from '../../validation';
@@ -14,7 +14,7 @@ npm.getPreset = jest.fn((_) => null);
 
 const ignoredPresets = ['default:group', 'default:timezone'];
 
-describe(getName(), () => {
+describe('config/presets/internal/index', () => {
   it('fails for undefined internal preset', async () => {
     const preset = 'foo:bar';
     const presetConfig = { extends: [preset] };
diff --git a/lib/config/presets/local/index.spec.ts b/lib/config/presets/local/index.spec.ts
index adf8a4cf59dcee966820cd60e150f17898af86a7..9728192a782d540c155bb1c0131320a4d2601f06 100644
--- a/lib/config/presets/local/index.spec.ts
+++ b/lib/config/presets/local/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import * as _azure from '../azure';
 import * as _bitbucket from '../bitbucket';
 import * as _bitbucketServer from '../bitbucket-server';
@@ -21,7 +21,7 @@ const gitea = mocked(_gitea);
 const github = mocked(_github);
 const gitlab = mocked(_gitlab);
 
-describe(getName(), () => {
+describe('config/presets/local/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     const preset = { resolved: 'preset' };
diff --git a/lib/config/presets/npm/index.spec.ts b/lib/config/presets/npm/index.spec.ts
index 5c4dfaac6d172af2e746ea45d610eeafe540ea5c..9ec951dd424a625d7080bf0ea16efb2c9ca1d9de 100644
--- a/lib/config/presets/npm/index.spec.ts
+++ b/lib/config/presets/npm/index.spec.ts
@@ -1,12 +1,11 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName } from '../../../../test/util';
 import { setGlobalConfig } from '../../global';
 import * as npm from '.';
 
 jest.mock('registry-auth-token');
 jest.mock('delay');
 
-describe(getName(), () => {
+describe('config/presets/npm/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     setGlobalConfig();
diff --git a/lib/config/presets/util.spec.ts b/lib/config/presets/util.spec.ts
index 752dc8fff6600b5989647c60b4dfc160de1ffd0c..79c8232a3554f4f50d0be5508568176b2146685c 100644
--- a/lib/config/presets/util.spec.ts
+++ b/lib/config/presets/util.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import type { FetchPresetConfig, Preset } from './types';
 import { PRESET_DEP_NOT_FOUND, PRESET_NOT_FOUND, fetchPreset } from './util';
 
@@ -11,7 +10,7 @@ const config: FetchPresetConfig = {
 
 const fetch = jest.fn(() => Promise.resolve<Preset>({}));
 
-describe(getName(), () => {
+describe('config/presets/util', () => {
   beforeEach(() => {
     fetch.mockReset();
   });
diff --git a/lib/config/secrets.spec.ts b/lib/config/secrets.spec.ts
index e1acda131687882346c4ef5289e02339bd601c56..20727e6eed3fcd8fcf79815c65feb2934305b75d 100644
--- a/lib/config/secrets.spec.ts
+++ b/lib/config/secrets.spec.ts
@@ -1,11 +1,11 @@
-import { defaultConfig, getName } from '../../test/util';
+import { defaultConfig } from '../../test/util';
 import {
   CONFIG_SECRETS_INVALID,
   CONFIG_VALIDATION,
 } from '../constants/error-messages';
 import { applySecretsToConfig, validateConfigSecrets } from './secrets';
 
-describe(getName(), () => {
+describe('config/secrets', () => {
   describe('validateConfigSecrets(config)', () => {
     it('works with default config', () => {
       expect(() => validateConfigSecrets(defaultConfig)).not.toThrow();
diff --git a/lib/config/validation-helpers/managers.spec.ts b/lib/config/validation-helpers/managers.spec.ts
index e0d89c1dbc57586df6ef94e0d3ac7f29e8abd098..981e12e2531973f47a27cd6656a4803c7fbef310 100644
--- a/lib/config/validation-helpers/managers.spec.ts
+++ b/lib/config/validation-helpers/managers.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { check } from './managers';
 
-describe(getName(), () => {
+describe('config/validation-helpers/managers', () => {
   it('should have no errors', () => {
     const res = check({
       resolvedRule: { matchManagers: ['npm'] },
diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts
index 886fe778380b0bb37d1277c8cd9eb04c2d30331b..7699913c1846c76a103f2608da77cba47cd51a07 100644
--- a/lib/config/validation.spec.ts
+++ b/lib/config/validation.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../test/util';
 import type { RenovateConfig } from './types';
 import * as configValidation from './validation';
 
-describe(getName(), () => {
+describe('config/validation', () => {
   describe('getParentName()', () => {
     it('ignores encrypted in root', () => {
       expect(configValidation.getParentName('encrypted')).toEqual('');
diff --git a/lib/datasource/adoptium-java/index.spec.ts b/lib/datasource/adoptium-java/index.spec.ts
index f775b9fd0c9d6f7f495740c78e4c0c28a156192f..38d1f37dbaaced98c3843676c7f00b2b50d3c23f 100644
--- a/lib/datasource/adoptium-java/index.spec.ts
+++ b/lib/datasource/adoptium-java/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { datasource, defaultRegistryUrl, pageSize } from './common';
 
@@ -17,7 +17,7 @@ function* range(start: number, end: number): Generator<number, number, number> {
   yield* range(start + 1, end);
 }
 
-describe(getName(), () => {
+describe('datasource/adoptium-java/index', () => {
   describe('getReleases', () => {
     it('throws for error', async () => {
       httpMock
diff --git a/lib/datasource/bitbucket-tags/index.spec.ts b/lib/datasource/bitbucket-tags/index.spec.ts
index 89487dd107215739bcae1afa05a7b9e7924b2f70..ef011d6e13dac7ffe7260e46ac9cbd6b4c4926af 100644
--- a/lib/datasource/bitbucket-tags/index.spec.ts
+++ b/lib/datasource/bitbucket-tags/index.spec.ts
@@ -1,11 +1,10 @@
 import { getDigest, getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { BitBucketTagsDatasource } from '.';
 
 const datasource = BitBucketTagsDatasource.id;
 
-describe(getName(), () => {
+describe('datasource/bitbucket-tags/index', () => {
   describe('getReleases', () => {
     it('returns tags from bitbucket cloud', async () => {
       const body = {
diff --git a/lib/datasource/cdnjs/index.spec.ts b/lib/datasource/cdnjs/index.spec.ts
index c7aed56bcd1581bec21c6ff5be5456f2e4955b7c..7ef5d19b204d6871ae5e26cabdcba600020854cc 100644
--- a/lib/datasource/cdnjs/index.spec.ts
+++ b/lib/datasource/cdnjs/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { CdnJsDatasource } from '.';
 
@@ -12,7 +12,7 @@ const baseUrl = 'https://api.cdnjs.com/';
 const pathFor = (s: string): string =>
   `/libraries/${s.split('/').shift()}?fields=homepage,repository,assets`;
 
-describe(getName(), () => {
+describe('datasource/cdnjs/index', () => {
   describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
diff --git a/lib/datasource/clojure/index.spec.ts b/lib/datasource/clojure/index.spec.ts
index 8fa371a74e6c05680532edc4b57979b45502296a..dd93c0c82abe63544c2c00d16dd7fab0e4ba92e9 100644
--- a/lib/datasource/clojure/index.spec.ts
+++ b/lib/datasource/clojure/index.spec.ts
@@ -1,7 +1,7 @@
 import upath from 'upath';
 import { ReleaseResult, getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import * as hostRules from '../../util/host-rules';
 import { id as versioning } from '../../versioning/maven';
 import { ClojureDatasource } from '.';
@@ -78,7 +78,7 @@ function get(
   return getPkgReleases(registryUrls ? { ...conf, registryUrls } : conf);
 }
 
-describe(getName(), () => {
+describe('datasource/clojure/index', () => {
   beforeEach(() => {
     hostRules.add({
       hostType: ClojureDatasource.id,
diff --git a/lib/datasource/crate/index.spec.ts b/lib/datasource/crate/index.spec.ts
index 72f68b3bad54d30293d04130e3176aff00f95472..afaac1b8261238d35fe0fd985ec3a6a2b3616fed 100644
--- a/lib/datasource/crate/index.spec.ts
+++ b/lib/datasource/crate/index.spec.ts
@@ -5,7 +5,7 @@ import { DirectoryResult, dir } from 'tmp-promise';
 import { dirname, join } from 'upath';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import * as memCache from '../../util/cache/memory';
@@ -60,7 +60,7 @@ function setupErrorGitMock(): { mockClone: jest.Mock<any, any> } {
   return { mockClone };
 }
 
-describe(getName(), () => {
+describe('datasource/crate/index', () => {
   describe('getIndexSuffix', () => {
     it('returns correct suffixes', () => {
       expect(getIndexSuffix('a')).toStrictEqual(['1', 'a']);
diff --git a/lib/datasource/dart/index.spec.ts b/lib/datasource/dart/index.spec.ts
index 286ac8767dd682eb2b227670979c03abd9107885..fe7eda4e2ad1a93120aaee8adb3590649c1b852a 100644
--- a/lib/datasource/dart/index.spec.ts
+++ b/lib/datasource/dart/index.spec.ts
@@ -1,13 +1,13 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadJsonFixture } from '../../../test/util';
+import { loadJsonFixture } from '../../../test/util';
 import { DartDatasource } from '.';
 
 const body = loadJsonFixture('shared_preferences.json');
 
 const baseUrl = 'https://pub.dartlang.org/api/packages/';
 
-describe(getName(), () => {
+describe('datasource/dart/index', () => {
   describe('getReleases', () => {
     it('returns null for empty result', async () => {
       httpMock.scope(baseUrl).get('/non_sense').reply(200, null);
diff --git a/lib/datasource/datasource.spec.ts b/lib/datasource/datasource.spec.ts
index 6a1255ff2800de354651aea022f137fae5ebc6c7..28630ff1b4cbcae81f83b1b2a10c18e91faf4e92 100644
--- a/lib/datasource/datasource.spec.ts
+++ b/lib/datasource/datasource.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../test/http-mock';
-import { getName } from '../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../constants/error-messages';
 import { Datasource } from './datasource';
 import type { GetReleasesConfig, ReleaseResult } from './types';
@@ -23,7 +22,7 @@ class TestDatasource extends Datasource {
   }
 }
 
-describe(getName(), () => {
+describe('datasource/datasource', () => {
   it('should throw on 429', async () => {
     const testDatasource = new TestDatasource();
 
diff --git a/lib/datasource/docker/common.spec.ts b/lib/datasource/docker/common.spec.ts
index 6c652b798a2846a79a16709222636180471b182e..d6d6e4d1e331cd205a6a25cbd2d9751835afdb17 100644
--- a/lib/datasource/docker/common.spec.ts
+++ b/lib/datasource/docker/common.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName, mocked } from '../../../test/util';
+import { mocked } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import * as dockerCommon from './common';
 
@@ -8,7 +8,7 @@ const hostRules = mocked(_hostRules);
 jest.mock('@aws-sdk/client-ecr');
 jest.mock('../../util/host-rules');
 
-describe(getName(), () => {
+describe('datasource/docker/common', () => {
   beforeEach(() => {
     hostRules.find.mockReturnValue({
       username: 'some-username',
diff --git a/lib/datasource/docker/index.spec.ts b/lib/datasource/docker/index.spec.ts
index 965c272c865995355b13b19a6a2daeaa3d90c24d..7ed91d93120bf96ef35675a0d429b891093eaecb 100644
--- a/lib/datasource/docker/index.spec.ts
+++ b/lib/datasource/docker/index.spec.ts
@@ -1,7 +1,7 @@
 import * as _AWS from '@aws-sdk/client-ecr';
 import { getDigest, getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, mocked, partial } from '../../../test/util';
+import { mocked, partial } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import * as _hostRules from '../../util/host-rules';
 import { id } from './common';
@@ -42,7 +42,7 @@ function mockEcrAuthReject(msg: string) {
   );
 }
 
-describe(getName(), () => {
+describe('datasource/docker/index', () => {
   beforeEach(() => {
     hostRules.find.mockReturnValue({
       username: 'some-username',
diff --git a/lib/datasource/galaxy-collection/index.spec.ts b/lib/datasource/galaxy-collection/index.spec.ts
index 9f1420a7cee9c19196115d3e1e6a89d30783f89f..052a00404b6c992f4f8f5a0fa4cbdaac3d591130 100644
--- a/lib/datasource/galaxy-collection/index.spec.ts
+++ b/lib/datasource/galaxy-collection/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { GalaxyCollectionDatasource } from '.';
 
@@ -22,7 +22,7 @@ const baseUrl = 'https://galaxy.ansible.com';
 
 const datasource = GalaxyCollectionDatasource.id;
 
-describe(getName(), () => {
+describe('datasource/galaxy-collection/index', () => {
   describe('getReleases', () => {
     it('returns null for 404 result', async () => {
       httpMock.scope(baseUrl).get('/api/v2/collections/foo/bar/').reply(404);
diff --git a/lib/datasource/galaxy/index.spec.ts b/lib/datasource/galaxy/index.spec.ts
index fd499327e029efe4e042adda73da7ba604cdef5a..eed41ba018a8bc65d2cf181257cdeb8e2b0e2e57 100644
--- a/lib/datasource/galaxy/index.spec.ts
+++ b/lib/datasource/galaxy/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { GalaxyDatasource } from '.';
 
 const res1 = loadFixture('timezone');
@@ -8,7 +8,7 @@ const empty = loadFixture('empty');
 
 const baseUrl = 'https://galaxy.ansible.com/';
 
-describe(getName(), () => {
+describe('datasource/galaxy/index', () => {
   describe('getReleases', () => {
     it('returns null for empty result', async () => {
       httpMock
diff --git a/lib/datasource/git-refs/index.spec.ts b/lib/datasource/git-refs/index.spec.ts
index 744404ae9256c85f351ad7e7ff9603cb5121bd5e..ae0d31258d9cbda1aaacf5b4c6c2ac45535685d4 100644
--- a/lib/datasource/git-refs/index.spec.ts
+++ b/lib/datasource/git-refs/index.spec.ts
@@ -1,6 +1,6 @@
 import _simpleGit from 'simple-git';
 import { getPkgReleases } from '..';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { id as datasource, getDigest } from '.';
 
 jest.mock('simple-git');
@@ -10,7 +10,7 @@ const depName = 'https://github.com/example/example.git';
 
 const lsRemote1 = loadFixture('ls-remote-1.txt');
 
-describe(getName(), () => {
+describe('datasource/git-refs/index', () => {
   describe('getReleases', () => {
     it('returns nil if response is wrong', async () => {
       simpleGit.mockReturnValue({
diff --git a/lib/datasource/git-tags/index.spec.ts b/lib/datasource/git-tags/index.spec.ts
index d1e347e2c94e25bb272c3d8bfe99fc9404be6ec9..6b05503946f35b968e3b41138ea9589e6d615e0b 100644
--- a/lib/datasource/git-tags/index.spec.ts
+++ b/lib/datasource/git-tags/index.spec.ts
@@ -1,6 +1,6 @@
 import _simpleGit from 'simple-git';
 import { getPkgReleases } from '..';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { id as datasource, getDigest } from '.';
 
 jest.mock('simple-git');
@@ -10,7 +10,7 @@ const depName = 'https://github.com/example/example.git';
 
 const lsRemote1 = loadFixture('ls-remote-1.txt', '../git-refs');
 
-describe(getName(), () => {
+describe('datasource/git-tags/index', () => {
   describe('getReleases', () => {
     it('returns nil if response is wrong', async () => {
       simpleGit.mockReturnValue({
diff --git a/lib/datasource/github-releases/common.spec.ts b/lib/datasource/github-releases/common.spec.ts
index 56081bfa6452fb4916dd6d19b2ec72bdf44b742e..ff01c64f1524a48abb95ffb494a437881e43ee89 100644
--- a/lib/datasource/github-releases/common.spec.ts
+++ b/lib/datasource/github-releases/common.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../test/util';
 import { getApiBaseUrl, getGithubRelease, getSourceUrlBase } from './common';
 import { GitHubReleaseMocker } from './test';
 
-describe(getName(), () => {
+describe('datasource/github-releases/common', () => {
   describe('getSourceUrlBase', () => {
     it('ensures trailing slash', () => {
       const sourceUrl = getSourceUrlBase('https://gh.my-company.com');
diff --git a/lib/datasource/github-releases/digest.spec.ts b/lib/datasource/github-releases/digest.spec.ts
index af82b8ff1087d5f3bd7f358e019fa7fe0aa27aae..dbedf63db73c0b9eab196b0b162e04413501af68 100644
--- a/lib/datasource/github-releases/digest.spec.ts
+++ b/lib/datasource/github-releases/digest.spec.ts
@@ -1,11 +1,10 @@
 import hasha from 'hasha';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { findDigestAsset, mapDigestAssetToRelease } from './digest';
 import { GitHubReleaseMocker } from './test';
 import { DigestAsset } from './types';
 
-describe(getName(), () => {
+describe('datasource/github-releases/digest', () => {
   const lookupName = 'some/dep';
   const releaseMock = new GitHubReleaseMocker(
     'https://api.github.com',
diff --git a/lib/datasource/github-releases/index.spec.ts b/lib/datasource/github-releases/index.spec.ts
index 72f866134be3d685fc1d1eca2b1505ed053ba1a3..2f03c8ed182ece69f3f9a0ec63576839ebb7b6ea 100644
--- a/lib/datasource/github-releases/index.spec.ts
+++ b/lib/datasource/github-releases/index.spec.ts
@@ -1,6 +1,5 @@
 import { getDigest, getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import { GitHubReleaseMocker } from './test';
 import { id as datasource } from '.';
@@ -24,7 +23,7 @@ const responseBody = [
   },
 ];
 
-describe(getName(), () => {
+describe('datasource/github-releases/index', () => {
   beforeEach(() => {
     hostRules.hosts.mockReturnValue([]);
     hostRules.find.mockReturnValue({
diff --git a/lib/datasource/github-tags/index.spec.ts b/lib/datasource/github-tags/index.spec.ts
index 26ad50fa7ad22b2a6726ebdb5766e5b0949840fc..4b8edc4ab82ace2bb868759a916f009f09e738eb 100644
--- a/lib/datasource/github-tags/index.spec.ts
+++ b/lib/datasource/github-tags/index.spec.ts
@@ -1,6 +1,5 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import * as github from '.';
 
@@ -10,7 +9,7 @@ const hostRules: any = _hostRules;
 const githubApiHost = 'https://api.github.com';
 const githubEnterpriseApiHost = 'https://git.enterprise.com';
 
-describe(getName(), () => {
+describe('datasource/github-tags/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     hostRules.hosts = jest.fn(() => []);
diff --git a/lib/datasource/gitlab-tags/index.spec.ts b/lib/datasource/gitlab-tags/index.spec.ts
index c451a6a8b8abdb94dca16c774d5748564316b06b..76ea7a59338b170c867cf29ccaa5d6938b490e57 100644
--- a/lib/datasource/gitlab-tags/index.spec.ts
+++ b/lib/datasource/gitlab-tags/index.spec.ts
@@ -1,9 +1,8 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { id as datasource } from '.';
 
-describe(getName(), () => {
+describe('datasource/gitlab-tags/index', () => {
   describe('getReleases', () => {
     it('returns tags from custom registry', async () => {
       const body = [
diff --git a/lib/datasource/go/goproxy.spec.ts b/lib/datasource/go/goproxy.spec.ts
index 309579f36c2e46d38c77d64da8dcecd1871fdf1f..60cdf12c09b1a203187b4a0b893b4dea3951c1c9 100644
--- a/lib/datasource/go/goproxy.spec.ts
+++ b/lib/datasource/go/goproxy.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import * as memCache from '../../util/cache/memory';
 import {
   encodeCase,
@@ -9,7 +9,7 @@ import {
   versionInfo,
 } from './goproxy';
 
-describe(getName(), () => {
+describe('datasource/go/goproxy', () => {
   beforeEach(() => {
     memCache.init();
   });
diff --git a/lib/datasource/go/index.spec.ts b/lib/datasource/go/index.spec.ts
index 9cbf976e3764cb57835208985b4fd59e7090207e..2ec64486019fceb864d215e047450ddc5ae310a3 100644
--- a/lib/datasource/go/index.spec.ts
+++ b/lib/datasource/go/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, logger, mocked } from '../../../test/util';
+import { logger, mocked } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import { id as datasource, getDigest } from '.';
 
@@ -46,7 +46,7 @@ const resGitHubEnterprise = `<!DOCTYPE html>
 </body>
 </html>`;
 
-describe(getName(), () => {
+describe('datasource/go/index', () => {
   beforeEach(() => {
     hostRules.find.mockReturnValue({});
     hostRules.hosts.mockReturnValue([]);
diff --git a/lib/datasource/gradle-version/index.spec.ts b/lib/datasource/gradle-version/index.spec.ts
index 4da63d73df8b052908768d7b7db170b51ff76b41..6333e7b90194b149725fdd2a84cd199022312c29 100644
--- a/lib/datasource/gradle-version/index.spec.ts
+++ b/lib/datasource/gradle-version/index.spec.ts
@@ -1,6 +1,6 @@
 import { GetPkgReleasesConfig, GetReleasesConfig, getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadJsonFixture, partial } from '../../../test/util';
+import { loadJsonFixture, partial } from '../../../test/util';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import { id as versioning } from '../../versioning/gradle';
 import { GradleVersionDatasource } from '.';
@@ -11,7 +11,7 @@ let config: GetPkgReleasesConfig;
 
 const datasource = GradleVersionDatasource.id;
 
-describe(getName(), () => {
+describe('datasource/gradle-version/index', () => {
   describe('getReleases', () => {
     beforeEach(() => {
       config = {
diff --git a/lib/datasource/helm/index.spec.ts b/lib/datasource/helm/index.spec.ts
index 1cb2105ceca9570a0efabc47790dbb7208871b2d..051b5df29f66b0bc91c13b65492cc4fd4a5b7684 100644
--- a/lib/datasource/helm/index.spec.ts
+++ b/lib/datasource/helm/index.spec.ts
@@ -1,12 +1,12 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { HelmDatasource } from '.';
 
 // Truncated index.yaml file
 const indexYaml = loadFixture('index.yaml');
 
-describe(getName(), () => {
+describe('datasource/helm/index', () => {
   describe('getReleases', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/datasource/hex/index.spec.ts b/lib/datasource/hex/index.spec.ts
index 4e6ad86586a19f4443fffce6957174eeff06d996..bbc8a30f9b8f2fb9d8723b007ca8750971f94e97 100644
--- a/lib/datasource/hex/index.spec.ts
+++ b/lib/datasource/hex/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, hostRules, loadJsonFixture } from '../../../test/util';
+import { hostRules, loadJsonFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { HexDatasource } from '.';
 
@@ -12,7 +12,7 @@ jest.mock('../../util/host-rules');
 const baseUrl = 'https://hex.pm/api';
 const datasource = HexDatasource.id;
 
-describe(getName(), () => {
+describe('datasource/hex/index', () => {
   beforeEach(() => {
     hostRules.hosts.mockReturnValue([]);
     hostRules.find.mockReturnValue({});
diff --git a/lib/datasource/index.spec.ts b/lib/datasource/index.spec.ts
index 9746d3b4083ff15bc60732f16b8aba7a0c3d5d73..1d3f6fa3cdaa51e56a5fd3b3992fb2fa888a8f50 100644
--- a/lib/datasource/index.spec.ts
+++ b/lib/datasource/index.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../test/http-mock';
-import { getName, logger, mocked } from '../../test/util';
+import { logger, mocked } from '../../test/util';
 import {
   EXTERNAL_HOST_ERROR,
   HOST_DISABLED,
@@ -26,7 +26,7 @@ const mavenDatasource = mocked(datasourceMaven);
 const npmDatasource = mocked(datasourceNpm);
 const packagistDatasource = mocked(datasourcePackagist);
 
-describe(getName(), () => {
+describe('datasource/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
   });
diff --git a/lib/datasource/jenkins-plugins/index.spec.ts b/lib/datasource/jenkins-plugins/index.spec.ts
index 8a2e7eb9a69c5453eaf4db4906dd1a54a2eb3b9b..9057c6443890156c5fe2f720af33b94ab80bf630 100644
--- a/lib/datasource/jenkins-plugins/index.spec.ts
+++ b/lib/datasource/jenkins-plugins/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadJsonFixture } from '../../../test/util';
+import { loadJsonFixture } from '../../../test/util';
 import * as versioning from '../../versioning/docker';
 import { resetCache } from './get';
 import * as jenkins from '.';
@@ -8,7 +8,7 @@ import * as jenkins from '.';
 const jenkinsPluginsVersions = loadJsonFixture('plugin-versions.json');
 const jenkinsPluginsInfo = loadJsonFixture('update-center.actual.json');
 
-describe(getName(), () => {
+describe('datasource/jenkins-plugins/index', () => {
   describe('getReleases', () => {
     const SKIP_CACHE = process.env.RENOVATE_SKIP_CACHE;
 
diff --git a/lib/datasource/maven/index.spec.ts b/lib/datasource/maven/index.spec.ts
index e610a5cc68d35d3ca6ddafe9befe2b272a869f66..a0f01050ddcaf31ccd336859ba5a4e107152c7c4 100644
--- a/lib/datasource/maven/index.spec.ts
+++ b/lib/datasource/maven/index.spec.ts
@@ -1,6 +1,6 @@
 import { ReleaseResult, getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import * as hostRules from '../../util/host-rules';
 import { id as versioning } from '../../versioning/maven';
@@ -74,7 +74,7 @@ function get(
   return getPkgReleases(registryUrls ? { ...conf, registryUrls } : conf);
 }
 
-describe(getName(), () => {
+describe('datasource/maven/index', () => {
   beforeEach(() => {
     hostRules.add({
       hostType: datasource,
diff --git a/lib/datasource/metadata.spec.ts b/lib/datasource/metadata.spec.ts
index eb27c5e7a7ebf4d75b7ba0d197dd23f79fa59999..7a05cc72f9402fda7f274c5d05d121a0bb105b14 100644
--- a/lib/datasource/metadata.spec.ts
+++ b/lib/datasource/metadata.spec.ts
@@ -1,11 +1,10 @@
-import { getName } from '../../test/util';
 import * as datasourceMaven from './maven';
 import { addMetaData } from './metadata';
 import * as datasourceNpm from './npm';
 import { PypiDatasource } from './pypi';
 import type { ReleaseResult } from './types';
 
-describe(getName(), () => {
+describe('datasource/metadata', () => {
   it('Should do nothing if dep is not specified', () => {
     expect(addMetaData()).toBeUndefined();
   });
diff --git a/lib/datasource/npm/get.spec.ts b/lib/datasource/npm/get.spec.ts
index 649498bfef7705727d5a5293dd552e0a23570efd..e8d0e3b9e7b27d936a8d05c34b5fd837947a1fb6 100644
--- a/lib/datasource/npm/get.spec.ts
+++ b/lib/datasource/npm/get.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import * as hostRules from '../../util/host-rules';
 import { getDependency, resetMemCache } from './get';
@@ -11,7 +10,7 @@ function getPath(s = ''): string {
   return `${prePath}/@myco%2Ftest`;
 }
 
-describe(getName(), () => {
+describe('datasource/npm/get', () => {
   beforeEach(() => {
     jest.clearAllMocks();
     resetMemCache();
diff --git a/lib/datasource/npm/index.spec.ts b/lib/datasource/npm/index.spec.ts
index 5b467295520c3d9ad2b8a07061eb6f91eb300d66..ae42c4af4c71db1c04d45bf1909c0d44a32bfb91 100644
--- a/lib/datasource/npm/index.spec.ts
+++ b/lib/datasource/npm/index.spec.ts
@@ -2,7 +2,6 @@ import mockDate from 'mockdate';
 import _registryAuthToken from 'registry-auth-token';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import * as hostRules from '../../util/host-rules';
@@ -15,7 +14,7 @@ const registryAuthToken: jest.Mock<_registryAuthToken.NpmCredentials> =
   _registryAuthToken as never;
 let npmResponse: any;
 
-describe(getName(), () => {
+describe('datasource/npm/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     setGlobalConfig();
diff --git a/lib/datasource/npm/npmrc.spec.ts b/lib/datasource/npm/npmrc.spec.ts
index c25ecc370ac727cb920ddc453915d2b4a6c7b36e..a013f823bff104d77793686e55ffc63a567d998c 100644
--- a/lib/datasource/npm/npmrc.spec.ts
+++ b/lib/datasource/npm/npmrc.spec.ts
@@ -1,4 +1,4 @@
-import { getName, mocked } from '../../../test/util';
+import { mocked } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import * as _sanitize from '../../util/sanitize';
 import { getNpmrc, setNpmrc } from './npmrc';
@@ -7,7 +7,7 @@ jest.mock('../../util/sanitize');
 
 const sanitize = mocked(_sanitize);
 
-describe(getName(), () => {
+describe('datasource/npm/npmrc', () => {
   beforeEach(() => {
     setNpmrc('');
     setGlobalConfig();
diff --git a/lib/datasource/nuget/index.spec.ts b/lib/datasource/nuget/index.spec.ts
index 61091a9ccc5d06c127f1cc95e954028ccb29d9c9..d6832c70351a2a3f00637a9b7abc743c63a08352 100644
--- a/lib/datasource/nuget/index.spec.ts
+++ b/lib/datasource/nuget/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import { id as versioning } from '../../versioning/nuget';
 import { id as datasource, parseRegistryUrl } from '.';
@@ -90,7 +90,7 @@ const configV3Multiple = {
   ],
 };
 
-describe(getName(), () => {
+describe('datasource/nuget/index', () => {
   describe('parseRegistryUrl', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/datasource/orb/index.spec.ts b/lib/datasource/orb/index.spec.ts
index 4d8feff26609699ea87c44edc60d9e3dab9b8519..57f1aa678b9fb68e03bf547def9a1ac1ff8faeb9 100644
--- a/lib/datasource/orb/index.spec.ts
+++ b/lib/datasource/orb/index.spec.ts
@@ -1,6 +1,5 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { OrbDatasource } from '.';
 
 const orbData = {
@@ -28,7 +27,7 @@ const baseUrl = 'https://circleci.com';
 
 const datasource = OrbDatasource.id;
 
-describe(getName(), () => {
+describe('datasource/orb/index', () => {
   describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
diff --git a/lib/datasource/packagist/index.spec.ts b/lib/datasource/packagist/index.spec.ts
index 57f7536b4356b6d717d28599184c25aa1adda839..a4e083e2d71349af134ebb34ceb34a2c907c3427 100644
--- a/lib/datasource/packagist/index.spec.ts
+++ b/lib/datasource/packagist/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadJsonFixture } from '../../../test/util';
+import { loadJsonFixture } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import * as composerVersioning from '../../versioning/composer';
 import { id as versioning } from '../../versioning/loose';
@@ -16,7 +16,7 @@ const mailchimpJson: any = loadJsonFixture('mailchimp-api.json');
 
 const baseUrl = 'https://packagist.org';
 
-describe(getName(), () => {
+describe('datasource/packagist/index', () => {
   describe('getReleases', () => {
     let config: any;
     beforeEach(() => {
diff --git a/lib/datasource/pod/index.spec.ts b/lib/datasource/pod/index.spec.ts
index b2463733383be47046d5bfb93a4b40e3fedeb011..28d681b3fd4af5391bf96eb558732c878a6f16c4 100644
--- a/lib/datasource/pod/index.spec.ts
+++ b/lib/datasource/pod/index.spec.ts
@@ -1,6 +1,5 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import * as rubyVersioning from '../../versioning/ruby';
 import * as pod from '.';
@@ -15,7 +14,7 @@ const config = {
 const githubApiHost = 'https://api.github.com';
 const cocoapodsHost = 'https://cdn.cocoapods.org';
 
-describe(getName(), () => {
+describe('datasource/pod/index', () => {
   describe('getReleases', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/datasource/pypi/index.spec.ts b/lib/datasource/pypi/index.spec.ts
index 4e06b1316e446c8005ad9f7322ab7e229a784693..26dd29f56699c5bda3231281d19249a4529bb7b7 100644
--- a/lib/datasource/pypi/index.spec.ts
+++ b/lib/datasource/pypi/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import * as hostRules from '../../util/host-rules';
 import { PypiDatasource } from '.';
 
@@ -16,7 +16,7 @@ const mixedHyphensResponse = loadFixture('versions-html-mixed-hyphens.html');
 const baseUrl = 'https://pypi.org/pypi';
 const datasource = PypiDatasource.id;
 
-describe(getName(), () => {
+describe('datasource/pypi/index', () => {
   describe('getReleases', () => {
     const OLD_ENV = process.env;
 
diff --git a/lib/datasource/repology/index.spec.ts b/lib/datasource/repology/index.spec.ts
index f984ac7bd8070c47d9cc465f91378b98f009a663..caaa3a0619c5910ed7787701cfdeda3c650c0b7c 100644
--- a/lib/datasource/repology/index.spec.ts
+++ b/lib/datasource/repology/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { id as versioning } from '../../versioning/loose';
 import type { RepologyPackage } from './types';
@@ -52,7 +52,7 @@ const fixtureGcc = loadFixture(`gcc.json`);
 const fixturePulseaudio = loadFixture(`pulseaudio.json`);
 const fixtureJdk = loadFixture(`openjdk.json`);
 
-describe(getName(), () => {
+describe('datasource/repology/index', () => {
   describe('getReleases', () => {
     it('returns null for empty result', async () => {
       mockResolverCall('debian_stable', 'nginx', 'binname', {
diff --git a/lib/datasource/ruby-version/index.spec.ts b/lib/datasource/ruby-version/index.spec.ts
index a4e94ce0b57941b8e00c854c5f9f8db263d06d11..26ba55c1deb0314eb17901b3ca8ac096da89e1eb 100644
--- a/lib/datasource/ruby-version/index.spec.ts
+++ b/lib/datasource/ruby-version/index.spec.ts
@@ -1,13 +1,13 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { RubyVersionDatasource } from '.';
 
 const rubyReleasesHtml = loadFixture('releases.html');
 
 const datasource = RubyVersionDatasource.id;
 
-describe(getName(), () => {
+describe('datasource/ruby-version/index', () => {
   describe('getReleases', () => {
     it('parses real data', async () => {
       httpMock
diff --git a/lib/datasource/rubygems/index.spec.ts b/lib/datasource/rubygems/index.spec.ts
index 8d935229cc9000fef8b75fc995f5eec03cf361c5..cd213d66b1569e082414579691b8b440ea7eec5c 100644
--- a/lib/datasource/rubygems/index.spec.ts
+++ b/lib/datasource/rubygems/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture, loadJsonFixture } from '../../../test/util';
+import { loadFixture, loadJsonFixture } from '../../../test/util';
 import * as rubyVersioning from '../../versioning/ruby';
 import { resetCache } from './get-rubygems-org';
 import * as rubygems from '.';
@@ -9,7 +9,7 @@ const rubygemsOrgVersions = loadFixture('rubygems-org.txt');
 const railsInfo = loadJsonFixture('rails/info.json');
 const railsVersions = loadJsonFixture('rails/versions.json');
 
-describe(getName(), () => {
+describe('datasource/rubygems/index', () => {
   describe('getReleases', () => {
     const SKIP_CACHE = process.env.RENOVATE_SKIP_CACHE;
 
diff --git a/lib/datasource/sbt-package/index.spec.ts b/lib/datasource/sbt-package/index.spec.ts
index 93be280383f355afc28ff9d06a3324b6fa616498..a1021129fc2e8f5a61c73cadf819803d639d27dd 100644
--- a/lib/datasource/sbt-package/index.spec.ts
+++ b/lib/datasource/sbt-package/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import * as mavenVersioning from '../../versioning/maven';
 import { MAVEN_REPO } from '../maven/common';
 import { parseIndexDir } from '../sbt-plugin/util';
@@ -9,7 +9,7 @@ import * as sbtPackage from '.';
 const mavenIndexHtml = loadFixture(`maven-index.html`);
 const sbtPluginIndex = loadFixture(`sbt-plugins-index.html`);
 
-describe(getName(), () => {
+describe('datasource/sbt-package/index', () => {
   it('parses Maven index directory', () => {
     expect(parseIndexDir(mavenIndexHtml)).toMatchSnapshot();
   });
diff --git a/lib/datasource/sbt-plugin/index.spec.ts b/lib/datasource/sbt-plugin/index.spec.ts
index aa57f43830b347f2d47483911211ba2450fffa52..805a629bc49346332c3ed49eb06226993d4ce1a8 100644
--- a/lib/datasource/sbt-plugin/index.spec.ts
+++ b/lib/datasource/sbt-plugin/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import * as mavenVersioning from '../../versioning/maven';
 import { MAVEN_REPO } from '../maven/common';
 import { parseIndexDir } from './util';
@@ -9,7 +9,7 @@ import * as sbtPlugin from '.';
 const mavenIndexHtml = loadFixture(`maven-index.html`);
 const sbtPluginIndex = loadFixture(`sbt-plugins-index.html`);
 
-describe(getName(), () => {
+describe('datasource/sbt-plugin/index', () => {
   it('parses Maven index directory', () => {
     expect(parseIndexDir(mavenIndexHtml)).toMatchSnapshot();
   });
diff --git a/lib/datasource/terraform-module/index.spec.ts b/lib/datasource/terraform-module/index.spec.ts
index c9576339b322dd8c6298f385be5a069edd076d45..721b84712e21987f28288857e6271690ffa87a08 100644
--- a/lib/datasource/terraform-module/index.spec.ts
+++ b/lib/datasource/terraform-module/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { TerraformModuleDatasource } from '.';
 
 const consulData: any = loadFixture('registry-consul.json');
@@ -13,7 +13,7 @@ const datasource = TerraformModuleDatasource.id;
 const baseUrl = 'https://registry.terraform.io';
 const localTerraformEnterprisebaseUrl = 'https://terraform.foo.bar';
 
-describe(getName(), () => {
+describe('datasource/terraform-module/index', () => {
   describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
diff --git a/lib/datasource/terraform-provider/index.spec.ts b/lib/datasource/terraform-provider/index.spec.ts
index 836e57be2a393d63c7b66148493f832d5a0b0c17..db274e1987f40c81710a5e6633b262854c2754e8 100644
--- a/lib/datasource/terraform-provider/index.spec.ts
+++ b/lib/datasource/terraform-provider/index.spec.ts
@@ -1,6 +1,6 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { TerraformProviderDatasource } from '.';
 
 const consulData: any = loadFixture('azurerm-provider.json');
@@ -14,7 +14,7 @@ const terraformProviderDatasource = new TerraformProviderDatasource();
 const primaryUrl = terraformProviderDatasource.defaultRegistryUrls[0];
 const secondaryUrl = terraformProviderDatasource.defaultRegistryUrls[1];
 
-describe(getName(), () => {
+describe('datasource/terraform-provider/index', () => {
   describe('getReleases', () => {
     it('returns null for empty result', async () => {
       httpMock
diff --git a/lib/logger/__snapshots__/index.spec.ts.snap b/lib/logger/__snapshots__/index.spec.ts.snap
index 281280bb59c76a86596da2dd20df84edaa6884d7..ffbe479d6dfc58102eabe559c830ee0b3bce5133 100644
--- a/lib/logger/__snapshots__/index.spec.ts.snap
+++ b/lib/logger/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`logger saves problems 1`] = `
+exports[`logger/index saves problems 1`] = `
 Array [
   Object {
     "any": "test",
diff --git a/lib/logger/config-serializer.spec.ts b/lib/logger/config-serializer.spec.ts
index 27912e1df3aafb895560d71fc471abf119a41bb2..8a0e53b35ee5a52e9882f5eb295fe2adf7265d38 100644
--- a/lib/logger/config-serializer.spec.ts
+++ b/lib/logger/config-serializer.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import configSerializer from './config-serializer';
 
-describe(getName(), () => {
+describe('logger/config-serializer', () => {
   it('squashes templates', () => {
     const config = {
       nottoken: 'b',
diff --git a/lib/logger/err-serializer.spec.ts b/lib/logger/err-serializer.spec.ts
index 13d43a03cd2de1091d542741008eadebfc93488b..61ef795e290064cf3192f6edc5cbea076fb1cf9e 100644
--- a/lib/logger/err-serializer.spec.ts
+++ b/lib/logger/err-serializer.spec.ts
@@ -1,11 +1,11 @@
 import * as httpMock from '../../test/http-mock';
-import { getName, partial } from '../../test/util';
+import { partial } from '../../test/util';
 import * as hostRules from '../util/host-rules';
 import { Http } from '../util/http';
 import errSerializer from './err-serializer';
 import { sanitizeValue } from './utils';
 
-describe(getName(), () => {
+describe('logger/err-serializer', () => {
   it('expands errors', () => {
     const err = partial<Error & Record<string, unknown>>({
       a: 1,
diff --git a/lib/logger/index.spec.ts b/lib/logger/index.spec.ts
index 8778a5715a17384a287fffc593596777b41361f6..abae2299f06fa6393f7d510eaa5c3f7ba2d942fe 100644
--- a/lib/logger/index.spec.ts
+++ b/lib/logger/index.spec.ts
@@ -19,7 +19,7 @@ jest.unmock('.');
 jest.mock('fs-extra');
 const fs: any = _fs;
 
-describe('logger', () => {
+describe('logger/index', () => {
   it('inits', () => {
     expect(logger).toBeDefined();
   });
diff --git a/lib/logger/pretty-stdout.spec.ts b/lib/logger/pretty-stdout.spec.ts
index 8c5d049a494eb443a4ecae2d13540a99994bb4a5..67848e4320c4e9d474476726148dc574fac335a4 100644
--- a/lib/logger/pretty-stdout.spec.ts
+++ b/lib/logger/pretty-stdout.spec.ts
@@ -1,5 +1,4 @@
 import chalk from 'chalk';
-import { getName } from '../../test/util';
 import * as prettyStdout from './pretty-stdout';
 import type { BunyanRecord } from './types';
 
@@ -10,7 +9,7 @@ jest.mock('chalk', () =>
   )
 );
 
-describe(getName(), () => {
+describe('logger/pretty-stdout', () => {
   describe('getMeta(rec)', () => {
     it('returns empty string if null rec', () => {
       expect(prettyStdout.getMeta(null as any)).toEqual('');
diff --git a/lib/manager/ansible-galaxy/extract.spec.ts b/lib/manager/ansible-galaxy/extract.spec.ts
index 0d3ef20bb9bc406a476685516bd79eb223d11908..960e6f8ea3cb258828972a6b54bad9c52d9aba0e 100644
--- a/lib/manager/ansible-galaxy/extract.spec.ts
+++ b/lib/manager/ansible-galaxy/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import extractPackageFile, { getSliceEndNumber } from './extract';
 
 const yamlFile1 = loadFixture('requirements01.yml');
@@ -8,7 +8,7 @@ const collections1 = loadFixture('collections1.yml');
 const collections2 = loadFixture('collections2.yml');
 const galaxy = loadFixture('galaxy.yml');
 
-describe(getName(), () => {
+describe('manager/ansible-galaxy/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here', 'requirements.yml')).toBeNull();
diff --git a/lib/manager/ansible/extract.spec.ts b/lib/manager/ansible/extract.spec.ts
index 3c61a5808c25031d928b123012607c28e6a370f7..f7217a3500a71377b37fce831d2234162b635f8b 100644
--- a/lib/manager/ansible/extract.spec.ts
+++ b/lib/manager/ansible/extract.spec.ts
@@ -1,10 +1,10 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import extractPackageFile from './extract';
 
 const yamlFile1 = loadFixture('main1.yaml');
 const yamlFile2 = loadFixture('main2.yaml');
 
-describe(getName(), () => {
+describe('manager/ansible/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/argocd/extract.spec.ts b/lib/manager/argocd/extract.spec.ts
index 1160b6b95f4b4494f69a6bc6d6c9a65b4cbb80c6..ad0289b2b10abae79e589bb0347606d2b1ccf1f5 100644
--- a/lib/manager/argocd/extract.spec.ts
+++ b/lib/manager/argocd/extract.spec.ts
@@ -1,11 +1,11 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const validApplication = loadFixture('validApplication.yml');
 const malformedApplication = loadFixture('malformedApplications.yml');
 const randomManifest = loadFixture('randomManifest.yml');
 
-describe(getName(), () => {
+describe('manager/argocd/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here', 'applications.yml')).toBeNull();
diff --git a/lib/manager/azure-pipelines/extract.spec.ts b/lib/manager/azure-pipelines/extract.spec.ts
index cf96d37f0c6908892711e16c02aa1fe688145335..e0b6ca9e207cc992e3f2538c2452b994fcfefe64 100644
--- a/lib/manager/azure-pipelines/extract.spec.ts
+++ b/lib/manager/azure-pipelines/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import {
   extractContainer,
   extractPackageFile,
@@ -14,7 +14,7 @@ const azurePipelinesNoDependency = loadFixture(
   'azure-pipelines-no-dependency.yaml'
 );
 
-describe(getName(), () => {
+describe('manager/azure-pipelines/extract', () => {
   it('should parse a valid azure-pipelines file', () => {
     const file = parseAzurePipelines(azurePipelines, 'some-file');
     expect(file).not.toBeNull();
diff --git a/lib/manager/batect-wrapper/artifacts.spec.ts b/lib/manager/batect-wrapper/artifacts.spec.ts
index 085cabdf870a8e14f0e47f0b4f0d5cfb90c2864a..7ab182b0583c919f25aae979008afe5d4bf2a176 100644
--- a/lib/manager/batect-wrapper/artifacts.spec.ts
+++ b/lib/manager/batect-wrapper/artifacts.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import type { UpdateArtifact } from '../types';
 import { updateArtifacts } from './artifacts';
 
@@ -25,7 +24,7 @@ function artifactForPath(
   };
 }
 
-describe(getName(), () => {
+describe('manager/batect-wrapper/artifacts', () => {
   beforeEach(() => {
     httpMock
       .scope('https://github.com')
diff --git a/lib/manager/batect-wrapper/extract.spec.ts b/lib/manager/batect-wrapper/extract.spec.ts
index 6735e3c6544783952577d4881009ea472ec2516b..d905ac52750c396bc0344adf0a85f737fd66e689 100644
--- a/lib/manager/batect-wrapper/extract.spec.ts
+++ b/lib/manager/batect-wrapper/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { id as githubReleaseDatasource } from '../../datasource/github-releases';
 import { id as semverVersioning } from '../../versioning/semver';
 import type { PackageDependency } from '../types';
@@ -7,7 +7,7 @@ import { extractPackageFile } from './extract';
 const validWrapperContent = loadFixture('valid-wrapper');
 const malformedWrapperContent = loadFixture('malformed-wrapper');
 
-describe(getName(), () => {
+describe('manager/batect-wrapper/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty wrapper file', () => {
       expect(extractPackageFile('')).toBeNull();
diff --git a/lib/manager/batect/extract.spec.ts b/lib/manager/batect/extract.spec.ts
index cd6df449d02ed91aa660878c644055fda71f04a4..09da6465c5612a9d164ec24e61a9f55bd277807e 100644
--- a/lib/manager/batect/extract.spec.ts
+++ b/lib/manager/batect/extract.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import { id as gitTagDatasource } from '../../datasource/git-tags';
@@ -33,7 +32,7 @@ const adminConfig: RepoGlobalConfig = {
 
 const config: ExtractConfig = {};
 
-describe(getName(), () => {
+describe('manager/batect/extract', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       setGlobalConfig(adminConfig);
diff --git a/lib/manager/bazel/extract.spec.ts b/lib/manager/bazel/extract.spec.ts
index 919b954b048187c2568951b78a4e0ddc2a5ddb0a..f9514ca53ced62b7a81bf22c2bda812da308f235 100644
--- a/lib/manager/bazel/extract.spec.ts
+++ b/lib/manager/bazel/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const workspaceFile = loadFixture('WORKSPACE1');
@@ -6,7 +6,7 @@ const workspace2File = loadFixture('WORKSPACE2');
 const workspace3File = loadFixture('WORKSPACE3');
 const fileWithBzlExtension = loadFixture('repositories.bzl');
 
-describe(getName(), () => {
+describe('manager/bazel/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns empty if fails to parse', () => {
       const res = extractPackageFile('blahhhhh:foo:@what\n');
diff --git a/lib/manager/bazel/update.spec.ts b/lib/manager/bazel/update.spec.ts
index 9d5e913d1a0cd2df2b6bdf14c61453f2f3955c78..a4d7d4f38f14370e500f62dbe2c5c29a1db33c3a 100644
--- a/lib/manager/bazel/update.spec.ts
+++ b/lib/manager/bazel/update.spec.ts
@@ -1,6 +1,6 @@
 import { Readable } from 'stream';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import type { UpdateType } from '../../config/types';
 import { updateDependency } from './update';
 
@@ -16,7 +16,7 @@ git_repository(
 )
 */
 
-describe(getName(), () => {
+describe('manager/bazel/update', () => {
   describe('updateDependency', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/buildkite/extract.spec.ts b/lib/manager/buildkite/extract.spec.ts
index f49d3405c70130151b4e4b39ef9083cd8fa59c4c..43dd8140be67a95a713bb04949f3cac2aa1b0210 100644
--- a/lib/manager/buildkite/extract.spec.ts
+++ b/lib/manager/buildkite/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const pipeline1 = loadFixture('pipeline1.yml');
@@ -6,7 +6,7 @@ const pipeline2 = loadFixture('pipeline2.yml');
 const pipeline3 = loadFixture('pipeline3.yml');
 const pipeline4 = loadFixture('pipeline4.yml');
 
-describe(getName(), () => {
+describe('manager/buildkite/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap b/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
index 03d956dd1fdc72b8989dc3cb958cc2c4637136d2..cd52e3f950830db2068bd7474670d9a090697140 100644
--- a/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`bundler.updateArtifacts() Docker .ruby-version 1`] = `
+exports[`manager/bundler/artifacts Docker .ruby-version 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:1.2.0",
@@ -36,7 +36,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker constraints options 1`] = `
+exports[`manager/bundler/artifacts Docker constraints options 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:latest",
@@ -72,7 +72,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker injects bundler host configuration as command with bundler < 2 1`] = `
+exports[`manager/bundler/artifacts Docker injects bundler host configuration as command with bundler < 2 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:1.2.0",
@@ -108,7 +108,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker injects bundler host configuration as command with bundler == latest 1`] = `
+exports[`manager/bundler/artifacts Docker injects bundler host configuration as command with bundler == latest 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:1.2.0",
@@ -144,7 +144,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker injects bundler host configuration as command with bundler >= 2 1`] = `
+exports[`manager/bundler/artifacts Docker injects bundler host configuration as command with bundler >= 2 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:1.2.0",
@@ -180,7 +180,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker injects bundler host configuration environment variables 1`] = `
+exports[`manager/bundler/artifacts Docker injects bundler host configuration environment variables 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:1.2.0",
@@ -217,7 +217,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker invalid constraints options 1`] = `
+exports[`manager/bundler/artifacts Docker invalid constraints options 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:latest",
@@ -253,7 +253,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() performs lockFileMaintenance 1`] = `
+exports[`manager/bundler/artifacts performs lockFileMaintenance 1`] = `
 Array [
   Object {
     "cmd": "bundle lock",
@@ -277,7 +277,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() returns error when failing in lockFileMaintenance true 1`] = `
+exports[`manager/bundler/artifacts returns error when failing in lockFileMaintenance true 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -289,7 +289,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() returns error when failing in lockFileMaintenance true 2`] = `
+exports[`manager/bundler/artifacts returns error when failing in lockFileMaintenance true 2`] = `
 Array [
   Object {
     "cmd": "bundle lock",
@@ -313,7 +313,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() returns null if Gemfile.lock was not changed 1`] = `
+exports[`manager/bundler/artifacts returns null if Gemfile.lock was not changed 1`] = `
 Array [
   Object {
     "cmd": "bundle lock --update foo bar",
@@ -337,7 +337,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() works explicit global binarySource 1`] = `
+exports[`manager/bundler/artifacts works explicit global binarySource 1`] = `
 Array [
   Object {
     "cmd": "bundle lock --update foo bar",
@@ -361,7 +361,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() works for default binarySource 1`] = `
+exports[`manager/bundler/artifacts works for default binarySource 1`] = `
 Array [
   Object {
     "cmd": "bundle lock --update foo bar",
diff --git a/lib/manager/bundler/__snapshots__/gemfile.spec.ts.snap b/lib/manager/bundler/__snapshots__/gemfile.spec.ts.snap
index 8ff55a1d444720501214dc4cf57199af23bda724..ae0c3b56d46c5fac67e3be72eee67ab323babaf8 100644
--- a/lib/manager/bundler/__snapshots__/gemfile.spec.ts.snap
+++ b/lib/manager/bundler/__snapshots__/gemfile.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`extract lib/manager/bundler/gemfile.rails.lock matches the expected output 1`] = `
+exports[`manager/bundler/gemfile matches the expected output 1`] = `
 Map {
   "activerecord-jdbc-adapter" => "52.1-java",
   "activerecord-jdbcmysql-adapter" => "52.1-java",
diff --git a/lib/manager/bundler/__snapshots__/locked-version.spec.ts.snap b/lib/manager/bundler/__snapshots__/locked-version.spec.ts.snap
index 5b3fe52411cf3eb8939c11a6e422327b302ae80d..aef1101f49c339b62f253fc95fe306306c7fe495 100644
--- a/lib/manager/bundler/__snapshots__/locked-version.spec.ts.snap
+++ b/lib/manager/bundler/__snapshots__/locked-version.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`/lib/manager/bundler/locked-version Parse Gitlab Foss Gem Lock File 1`] = `
+exports[`manager/bundler/locked-version Parse Gitlab Foss Gem Lock File 1`] = `
 Map {
   "RedCloth" => "4.3.2",
   "abstract_type" => "0.0.7",
@@ -483,7 +483,7 @@ Map {
 }
 `;
 
-exports[`/lib/manager/bundler/locked-version Parse Mastodon Gem Lock File 1`] = `
+exports[`manager/bundler/locked-version Parse Mastodon Gem Lock File 1`] = `
 Map {
   "actioncable" => "5.2.4.1",
   "actionmailer" => "5.2.4.1",
@@ -754,7 +754,7 @@ Map {
 }
 `;
 
-exports[`/lib/manager/bundler/locked-version Parse Rails Gem Lock File 1`] = `
+exports[`manager/bundler/locked-version Parse Rails Gem Lock File 1`] = `
 Map {
   "activerecord-jdbc-adapter" => "52.1-java",
   "activerecord-jdbcmysql-adapter" => "52.1-java",
@@ -944,7 +944,7 @@ Map {
 }
 `;
 
-exports[`/lib/manager/bundler/locked-version Parse Ruby CI Gem Lock File 1`] = `
+exports[`manager/bundler/locked-version Parse Ruby CI Gem Lock File 1`] = `
 Map {
   "actioncable" => "5.2.3",
   "actionmailer" => "5.2.3",
@@ -1013,7 +1013,7 @@ Map {
 }
 `;
 
-exports[`/lib/manager/bundler/locked-version Parse WebPacker Gem Lock File 1`] = `
+exports[`manager/bundler/locked-version Parse WebPacker Gem Lock File 1`] = `
 Map {
   "actioncable" => "6.0.1",
   "actionmailbox" => "6.0.1",
diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts
index c06e29a36c551c50449eb281745d5ec712e596a3..a13202422dec75490e962ee94714895886c69f44 100644
--- a/lib/manager/bundler/artifacts.spec.ts
+++ b/lib/manager/bundler/artifacts.spec.ts
@@ -41,7 +41,7 @@ const updatedGemfileLock = {
   },
 };
 
-describe('bundler.updateArtifacts()', () => {
+describe('manager/bundler/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/bundler/extract.spec.ts b/lib/manager/bundler/extract.spec.ts
index c02f69cf23949f7638960b11f4eb76a460cf3af2..7548328d5263a62bf9b99d572b60f881ed36996d 100644
--- a/lib/manager/bundler/extract.spec.ts
+++ b/lib/manager/bundler/extract.spec.ts
@@ -1,4 +1,4 @@
-import { fs, getName, loadFixture } from '../../../test/util';
+import { fs, loadFixture } from '../../../test/util';
 import { isValid } from '../../versioning/ruby';
 import { extractPackageFile } from './extract';
 
@@ -31,7 +31,7 @@ function validateGems(raw, parsed) {
   expect(gemfileGemCount).toEqual(parsedGemCount);
 }
 
-describe(getName(), () => {
+describe('manager/bundler/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', async () => {
       expect(await extractPackageFile('nothing here', 'Gemfile')).toBeNull();
diff --git a/lib/manager/bundler/gemfile.spec.ts b/lib/manager/bundler/gemfile.spec.ts
index 74485bd4f7a1042bb983a70d8d9c0ca0dd8255b9..6d6dfc8ec4ae29690d571234e555f830562bcb99 100644
--- a/lib/manager/bundler/gemfile.spec.ts
+++ b/lib/manager/bundler/gemfile.spec.ts
@@ -3,7 +3,7 @@ import { extractLockFileEntries } from './locked-version';
 
 const gemLockFile = loadFixture('Gemfile.rails.lock');
 
-describe('extract lib/manager/bundler/gemfile.rails.lock', () => {
+describe('manager/bundler/gemfile', () => {
   it('matches the expected output', () => {
     const res = extractLockFileEntries(gemLockFile);
     expect(res.size).toEqual(185);
diff --git a/lib/manager/bundler/host-rules.spec.ts b/lib/manager/bundler/host-rules.spec.ts
index bc8ca325b5fd704b70f6162c3ce5e9192c5e6acc..3aa78358a31f22d57e0eb86caadada06f57b337e 100644
--- a/lib/manager/bundler/host-rules.spec.ts
+++ b/lib/manager/bundler/host-rules.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import { HostRule } from '../../types';
 import { add, clear } from '../../util/host-rules';
 
@@ -7,7 +6,7 @@ import {
   getAuthenticationHeaderValue,
 } from './host-rules';
 
-describe(getName(), () => {
+describe('manager/bundler/host-rules', () => {
   beforeEach(() => {
     clear();
   });
diff --git a/lib/manager/bundler/locked-version.spec.ts b/lib/manager/bundler/locked-version.spec.ts
index d2fee8a0971943cbd019770acb26a277d6c9659b..6921b83bd28000a7aa31bc649fb5a0a2fe9191ef 100644
--- a/lib/manager/bundler/locked-version.spec.ts
+++ b/lib/manager/bundler/locked-version.spec.ts
@@ -7,7 +7,7 @@ const mastodonGemfileLock = loadFixture('Gemfile.mastodon.lock');
 const rubyCIGemfileLock = loadFixture('Gemfile.rubyci.lock');
 const gitlabFossGemfileLock = loadFixture('Gemfile.gitlab-foss.lock');
 
-describe('/lib/manager/bundler/locked-version', () => {
+describe('manager/bundler/locked-version', () => {
   test('Parse Rails Gem Lock File', () => {
     const parsedLockEntries = extractLockFileEntries(railsGemfileLock);
     expect(parsedLockEntries.size).toEqual(185);
diff --git a/lib/manager/bundler/range.spec.ts b/lib/manager/bundler/range.spec.ts
index 01f2f41deda15d4b1020ef78720f057c9d211f31..7591971aa8d10eb47e04c7c8c0d6040fc33ba045 100644
--- a/lib/manager/bundler/range.spec.ts
+++ b/lib/manager/bundler/range.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../test/util';
 import type { RangeConfig } from '../types';
 import { getRangeStrategy } from '.';
 
-describe(getName(), () => {
+describe('manager/bundler/range', () => {
   describe('getRangeStrategy()', () => {
     it('returns replace when rangeStrategy is auto', () => {
       const config: RangeConfig = { rangeStrategy: 'auto' };
diff --git a/lib/manager/cake/index.spec.ts b/lib/manager/cake/index.spec.ts
index 059e98cc5b5110636bebb8a2db210b9146d2f73c..7ae0efa03e6134cb2ad6b0da6055d0a09f29fdfd 100644
--- a/lib/manager/cake/index.spec.ts
+++ b/lib/manager/cake/index.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
 const content = loadFixture('build.cake');
 
-describe(getName(), () => {
+describe('manager/cake/index', () => {
   it('extracts', () => {
     expect(extractPackageFile(content)).toMatchSnapshot({
       deps: [
diff --git a/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap b/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap
index c4379f28540af2427536351acfa90fd97aae4513..babdcd777c79ce1615331fb8732cf6f40e97bca2 100644
--- a/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/cargo/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/cargo/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "cargo update --manifest-path Cargo.toml --package dep1",
@@ -23,7 +23,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Cargo.lock 1`] = `
+exports[`manager/cargo/artifacts returns updated Cargo.lock 1`] = `
 Array [
   Object {
     "cmd": "cargo update --manifest-path Cargo.toml --package dep1",
@@ -46,7 +46,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Cargo.lock for lockfile maintenance 1`] = `
+exports[`manager/cargo/artifacts returns updated Cargo.lock for lockfile maintenance 1`] = `
 Array [
   Object {
     "cmd": "cargo update --manifest-path Cargo.toml",
@@ -69,7 +69,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Cargo.lock with docker 1`] = `
+exports[`manager/cargo/artifacts returns updated Cargo.lock with docker 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/rust",
@@ -104,7 +104,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated workspace Cargo.lock 1`] = `
+exports[`manager/cargo/artifacts returns updated workspace Cargo.lock 1`] = `
 Array [
   Object {
     "cmd": "cargo update --manifest-path crates/one/Cargo.toml --package dep1",
@@ -127,7 +127,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() updates Cargo.lock based on the lookupName, when given 1`] = `
+exports[`manager/cargo/artifacts updates Cargo.lock based on the lookupName, when given 1`] = `
 Array [
   Object {
     "cmd": "cargo update --manifest-path Cargo.toml --package dep1",
diff --git a/lib/manager/cargo/artifacts.spec.ts b/lib/manager/cargo/artifacts.spec.ts
index 69add232ba8ccd0a5eb74d395baca6e327afa75c..b3ee807645ec01012eaf76aa352dc0a5410b17a7 100644
--- a/lib/manager/cargo/artifacts.spec.ts
+++ b/lib/manager/cargo/artifacts.spec.ts
@@ -27,7 +27,7 @@ const adminConfig: RepoGlobalConfig = {
   localDir: join('/tmp/github/some/repo'),
 };
 
-describe('.updateArtifacts()', () => {
+describe('manager/cargo/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/cargo/extract.spec.ts b/lib/manager/cargo/extract.spec.ts
index c70875406b8302b74a1f075de130eb22916bc2de..e733510baa1a3f67820aea1840f185afec44f852 100644
--- a/lib/manager/cargo/extract.spec.ts
+++ b/lib/manager/cargo/extract.spec.ts
@@ -1,6 +1,6 @@
 import { dir } from 'tmp-promise';
 import { join } from 'upath';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import { writeLocalFile } from '../../util/fs';
@@ -15,7 +15,7 @@ const cargo5toml = loadFixture('Cargo.5.toml');
 const cargo6configtoml = loadFixture('cargo.6.config.toml');
 const cargo6toml = loadFixture('Cargo.6.toml');
 
-describe(getName(), () => {
+describe('manager/cargo/extract', () => {
   describe('extractPackageFile()', () => {
     let config: ExtractConfig;
     let adminConfig: RepoGlobalConfig;
diff --git a/lib/manager/cdnurl/extract.spec.ts b/lib/manager/cdnurl/extract.spec.ts
index d6006986e2351b5840ce5b1d594bd72ad4d02c39..6fb3e7d82c57b10d69abd43e1fda3a2227644957 100644
--- a/lib/manager/cdnurl/extract.spec.ts
+++ b/lib/manager/cdnurl/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
 const input = loadFixture(`sample.txt`);
 
-describe(getName(), () => {
+describe('manager/cdnurl/extract', () => {
   it('extractPackageFile', () => {
     expect(extractPackageFile(input)).toMatchSnapshot({
       deps: [
diff --git a/lib/manager/circleci/extract.spec.ts b/lib/manager/circleci/extract.spec.ts
index a165c43ab7caf7434fd629e4a657bb20776f0988..c4a10688fc075979c8d2315bb49aaab47dc6f52a 100644
--- a/lib/manager/circleci/extract.spec.ts
+++ b/lib/manager/circleci/extract.spec.ts
@@ -1,11 +1,11 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const file1 = loadFixture('config.yml');
 const file2 = loadFixture('config2.yml');
 const file3 = loadFixture('config3.yml');
 
-describe(getName(), () => {
+describe('manager/circleci/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/cloudbuild/extract.spec.ts b/lib/manager/cloudbuild/extract.spec.ts
index 1724d763afae83af74df5b46d0b15162e08ffab2..9b604be842b9c619342e5b93badbf348cdb9028d 100644
--- a/lib/manager/cloudbuild/extract.spec.ts
+++ b/lib/manager/cloudbuild/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const file1 = loadFixture('cloudbuild.yml');
 
-describe(getName(), () => {
+describe('manager/cloudbuild/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap b/lib/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap
index ef0777414e78430489bd97f0d010b3e5741eed88..8893a1aae3ac7317156ea60eca0813505f6cba97 100644
--- a/lib/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() dynamically selects Docker image tag 1`] = `
+exports[`manager/cocoapods/artifacts dynamically selects Docker image tag 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/cocoapods:1.2.4",
@@ -36,7 +36,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() falls back to the \`latest\` Docker image tag 1`] = `
+exports[`manager/cocoapods/artifacts falls back to the \`latest\` Docker image tag 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/cocoapods:latest",
@@ -72,13 +72,13 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns null for invalid local directory 1`] = `Array []`;
+exports[`manager/cocoapods/artifacts returns null for invalid local directory 1`] = `Array []`;
 
-exports[`.updateArtifacts() returns null if no Podfile.lock found 1`] = `Array []`;
+exports[`manager/cocoapods/artifacts returns null if no Podfile.lock found 1`] = `Array []`;
 
-exports[`.updateArtifacts() returns null if no updatedDeps were provided 1`] = `Array []`;
+exports[`manager/cocoapods/artifacts returns null if no updatedDeps were provided 1`] = `Array []`;
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/cocoapods/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "pod install",
@@ -102,9 +102,9 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns null if updatedDeps is empty 1`] = `Array []`;
+exports[`manager/cocoapods/artifacts returns null if updatedDeps is empty 1`] = `Array []`;
 
-exports[`.updateArtifacts() returns pod exec error 1`] = `
+exports[`manager/cocoapods/artifacts returns pod exec error 1`] = `
 Array [
   Object {
     "cmd": "pod install",
@@ -128,7 +128,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Podfile 1`] = `
+exports[`manager/cocoapods/artifacts returns updated Podfile 1`] = `
 Array [
   Object {
     "file": Object {
@@ -139,7 +139,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Podfile 2`] = `
+exports[`manager/cocoapods/artifacts returns updated Podfile 2`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/cocoapods",
@@ -175,7 +175,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Podfile and Pods files 1`] = `
+exports[`manager/cocoapods/artifacts returns updated Podfile and Pods files 1`] = `
 Array [
   Object {
     "file": Object {
@@ -204,7 +204,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Podfile and Pods files 2`] = `
+exports[`manager/cocoapods/artifacts returns updated Podfile and Pods files 2`] = `
 Array [
   Object {
     "cmd": "docker ps --filter name=renovate_cocoapods -aq",
diff --git a/lib/manager/cocoapods/artifacts.spec.ts b/lib/manager/cocoapods/artifacts.spec.ts
index 91f429b107013b1910a2752509a7534fa09df697..06bd91f6af1026f4b698689ebe3af19114b48dd8 100644
--- a/lib/manager/cocoapods/artifacts.spec.ts
+++ b/lib/manager/cocoapods/artifacts.spec.ts
@@ -32,7 +32,7 @@ const adminConfig: RepoGlobalConfig = {
   cacheDir: join('/tmp/cache'),
 };
 
-describe('.updateArtifacts()', () => {
+describe('manager/cocoapods/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     env.getChildProcessEnv.mockReturnValue(envMock.basic);
diff --git a/lib/manager/cocoapods/extract.spec.ts b/lib/manager/cocoapods/extract.spec.ts
index ec1ce46618b4551079a9386a54de073ab32d5648..3ff03c63673dac50e630c6eb1173e1e8bc34852f 100644
--- a/lib/manager/cocoapods/extract.spec.ts
+++ b/lib/manager/cocoapods/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import { extractPackageFile } from '.';
@@ -8,7 +8,7 @@ const complexPodfile = loadFixture('Podfile.complex');
 
 const adminConfig: RepoGlobalConfig = { localDir: '' };
 
-describe(getName(), () => {
+describe('manager/cocoapods/extract', () => {
   describe('extractPackageFile()', () => {
     it('extracts from simple file', async () => {
       setGlobalConfig(adminConfig);
diff --git a/lib/manager/composer/__snapshots__/artifacts.spec.ts.snap b/lib/manager/composer/__snapshots__/artifacts.spec.ts.snap
index 7257baf1a935aa7f43fc6b706968cb32b0db7933..f814fe495bea3dcaf3e3a3b181fe0bc96aa442ea 100644
--- a/lib/manager/composer/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/composer/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() catches errors 1`] = `
+exports[`manager/composer/artifacts catches errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -11,7 +11,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() catches unmet requirements errors 1`] = `
+exports[`manager/composer/artifacts catches unmet requirements errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -22,7 +22,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() disables ignorePlatformReqs 1`] = `
+exports[`manager/composer/artifacts disables ignorePlatformReqs 1`] = `
 Array [
   Object {
     "cmd": "composer update --with-dependencies --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
@@ -46,7 +46,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() performs lockFileMaintenance 1`] = `
+exports[`manager/composer/artifacts performs lockFileMaintenance 1`] = `
 Array [
   Object {
     "cmd": "composer install --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
@@ -70,7 +70,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/composer/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "composer update foo bar --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction",
@@ -94,7 +94,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated composer.lock 1`] = `
+exports[`manager/composer/artifacts returns updated composer.lock 1`] = `
 Array [
   Object {
     "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
@@ -118,7 +118,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports docker mode 1`] = `
+exports[`manager/composer/artifacts supports docker mode 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/php:7.3",
@@ -154,7 +154,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports global mode 1`] = `
+exports[`manager/composer/artifacts supports global mode 1`] = `
 Array [
   Object {
     "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
@@ -178,7 +178,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports vendor directory update 1`] = `
+exports[`manager/composer/artifacts supports vendor directory update 1`] = `
 Array [
   Object {
     "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
@@ -202,7 +202,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() uses hostRules to set COMPOSER_AUTH 1`] = `
+exports[`manager/composer/artifacts uses hostRules to set COMPOSER_AUTH 1`] = `
 Array [
   Object {
     "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
diff --git a/lib/manager/composer/artifacts.spec.ts b/lib/manager/composer/artifacts.spec.ts
index 5028ff78b66e0758788623fef8bd432a2d2c97bd..5f40df722f8fb2713426c238390446e953bb589c 100644
--- a/lib/manager/composer/artifacts.spec.ts
+++ b/lib/manager/composer/artifacts.spec.ts
@@ -41,7 +41,7 @@ const repoStatus = partial<StatusResult>({
   deleted: [],
 });
 
-describe('.updateArtifacts()', () => {
+describe('manager/composer/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/composer/extract.spec.ts b/lib/manager/composer/extract.spec.ts
index 0aff3224f9c53bb8fb25a1f9b6d495d8f13149b4..bd289702353402c66b61826689bb7822f2d3884b 100644
--- a/lib/manager/composer/extract.spec.ts
+++ b/lib/manager/composer/extract.spec.ts
@@ -1,4 +1,4 @@
-import { fs, getName, loadFixture } from '../../../test/util';
+import { fs, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
@@ -10,7 +10,7 @@ const requirements4 = loadFixture('composer4.json');
 const requirements5 = loadFixture('composer5.json');
 const requirements5Lock = loadFixture('composer5.lock');
 
-describe(getName(), () => {
+describe('manager/composer/extract', () => {
   describe('extractPackageFile()', () => {
     let packageFile;
     beforeEach(() => {
diff --git a/lib/manager/composer/range.spec.ts b/lib/manager/composer/range.spec.ts
index 90b2c2f8ff3a5d28ca9e4ee12a6223ea61620138..91e53b001752d069c725944c21769e0880483b00 100644
--- a/lib/manager/composer/range.spec.ts
+++ b/lib/manager/composer/range.spec.ts
@@ -1,7 +1,7 @@
 import type { RangeConfig } from '../types';
 import { getRangeStrategy } from '.';
 
-describe('getRangeStrategy', () => {
+describe('manager/composer/range', () => {
   it('returns same if not auto', () => {
     const config: RangeConfig = { rangeStrategy: 'widen' };
     expect(getRangeStrategy(config)).toEqual('widen');
diff --git a/lib/manager/composer/utils.spec.ts b/lib/manager/composer/utils.spec.ts
index 8102e71fe88819af80332fc94f2e06eadce7212a..de07a966cdc3135922aaed37de15af3fbbcd856a 100644
--- a/lib/manager/composer/utils.spec.ts
+++ b/lib/manager/composer/utils.spec.ts
@@ -1,4 +1,4 @@
-import { getName, mocked } from '../../../test/util';
+import { mocked } from '../../../test/util';
 import * as _datasource from '../../datasource';
 import { extractContraints, getComposerConstraint } from './utils';
 
@@ -6,7 +6,7 @@ jest.mock('../../../lib/datasource');
 
 const datasource = mocked(_datasource);
 
-describe(getName(), () => {
+describe('manager/composer/utils', () => {
   describe('getComposerConstraint', () => {
     beforeEach(() => {
       datasource.getPkgReleases.mockResolvedValueOnce({
diff --git a/lib/manager/deps-edn/extract.spec.ts b/lib/manager/deps-edn/extract.spec.ts
index c91b094f4bb48718f853e69160141a97251b31ac..286a710590b6136f1d9e7885ee20908ba1073f91 100644
--- a/lib/manager/deps-edn/extract.spec.ts
+++ b/lib/manager/deps-edn/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const depsEdn = loadFixture('deps.edn');
 
-describe(getName(), () => {
+describe('manager/deps-edn/extract', () => {
   it('extractPackageFile', () => {
     // FIXME: explicit assert condition
     expect(extractPackageFile(depsEdn)).toMatchSnapshot();
diff --git a/lib/manager/docker-compose/extract.spec.ts b/lib/manager/docker-compose/extract.spec.ts
index c1bbd0acfce4573146115aa8f75ca8eda0ae6a75..e0b09bddf84c60cd14a7f1f8569a448e0432596e 100644
--- a/lib/manager/docker-compose/extract.spec.ts
+++ b/lib/manager/docker-compose/extract.spec.ts
@@ -1,11 +1,11 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const yamlFile1 = loadFixture('docker-compose.1.yml');
 const yamlFile3 = loadFixture('docker-compose.3.yml');
 const yamlFile3NoVersion = loadFixture('docker-compose.3-no-version.yml');
 
-describe(getName(), () => {
+describe('manager/docker-compose/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('')).toBeNull();
diff --git a/lib/manager/dockerfile/extract.spec.ts b/lib/manager/dockerfile/extract.spec.ts
index 96ebdcd718bbd2b19da125bcfe24c70213b0c28e..2270aae669ac65cf907eebd47efad6e3035374e0 100644
--- a/lib/manager/dockerfile/extract.spec.ts
+++ b/lib/manager/dockerfile/extract.spec.ts
@@ -1,10 +1,10 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile, getDep } from './extract';
 
 const d1 = loadFixture('1.Dockerfile');
 const d2 = loadFixture('2.Dockerfile');
 
-describe(getName(), () => {
+describe('manager/dockerfile/extract', () => {
   describe('extractPackageFile()', () => {
     it('handles no FROM', () => {
       const res = extractPackageFile('no from!');
diff --git a/lib/manager/droneci/extract.spec.ts b/lib/manager/droneci/extract.spec.ts
index db090b4903258342740a9bc1a1efc1add6929c7c..b53439d9cd45153b7854f120dda6563d5d2e4321 100644
--- a/lib/manager/droneci/extract.spec.ts
+++ b/lib/manager/droneci/extract.spec.ts
@@ -1,10 +1,10 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 
 import { extractPackageFile } from './extract';
 
 const droneYAML = loadFixture('.drone.yml');
 
-describe(getName(), () => {
+describe('manager/droneci/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/git-submodules/artifact.spec.ts b/lib/manager/git-submodules/artifact.spec.ts
index e62be64b41e07aa991c1ab8fa8690798d7d8a940..e2c80005c753ea5d70fad03009587bf3e74f4155 100644
--- a/lib/manager/git-submodules/artifact.spec.ts
+++ b/lib/manager/git-submodules/artifact.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import updateArtifacts from './artifacts';
 
-describe(getName(), () => {
+describe('manager/git-submodules/artifact', () => {
   describe('updateArtifacts()', () => {
     it('returns empty content', () => {
       // FIXME: explicit assert condition
diff --git a/lib/manager/git-submodules/extract.spec.ts b/lib/manager/git-submodules/extract.spec.ts
index a976e64d3c0845063965672507f3ff5b763cf270..e73c16930640e1df2bbd037af9e33732d2b809d3 100644
--- a/lib/manager/git-submodules/extract.spec.ts
+++ b/lib/manager/git-submodules/extract.spec.ts
@@ -1,6 +1,6 @@
 import { mock } from 'jest-mock-extended';
 import _simpleGit, { Response, SimpleGit } from 'simple-git';
-import { getName, partial } from '../../../test/util';
+import { partial } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import * as hostRules from '../../util/host-rules';
 import type { PackageFile } from '../types';
@@ -10,7 +10,7 @@ jest.mock('simple-git');
 const simpleGit: jest.Mock<Partial<SimpleGit>> = _simpleGit as never;
 const Git: typeof _simpleGit = jest.requireActual('simple-git');
 
-describe(getName(), () => {
+describe('manager/git-submodules/extract', () => {
   // flaky ci tests
   jest.setTimeout(10 * 1000);
 
diff --git a/lib/manager/git-submodules/update.spec.ts b/lib/manager/git-submodules/update.spec.ts
index 9e6a11c9e43e0b8c5d11a4b422846f3ddcc1b110..ef7e07bdafaccca0c925c352f103f89a701c2be4 100644
--- a/lib/manager/git-submodules/update.spec.ts
+++ b/lib/manager/git-submodules/update.spec.ts
@@ -1,7 +1,6 @@
 import _simpleGit from 'simple-git';
 import { dir } from 'tmp-promise';
 import { join } from 'upath';
-import { getName } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import type { Upgrade } from '../types';
@@ -10,7 +9,7 @@ import updateDependency from './update';
 jest.mock('simple-git');
 const simpleGit: any = _simpleGit;
 
-describe(getName(), () => {
+describe('manager/git-submodules/update', () => {
   describe('updateDependency', () => {
     let upgrade: Upgrade;
     let adminConfig: RepoGlobalConfig;
diff --git a/lib/manager/github-actions/extract.spec.ts b/lib/manager/github-actions/extract.spec.ts
index a26dba48531211838cc7031df9f621743d44b08c..94926c9535d6e5ff2d04f64bcf33ef0ab2cec1e0 100644
--- a/lib/manager/github-actions/extract.spec.ts
+++ b/lib/manager/github-actions/extract.spec.ts
@@ -1,10 +1,10 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const workflow1 = loadFixture('workflow_1.yml');
 const workflow2 = loadFixture('workflow_2.yml');
 
-describe(getName(), () => {
+describe('manager/github-actions/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/gitlabci-include/extract.spec.ts b/lib/manager/gitlabci-include/extract.spec.ts
index d4cb6fb9ecb45caf027b8632a623ec64a10eeae8..e57a302d12f2ec1d4b832914d9fc784b0422dca7 100644
--- a/lib/manager/gitlabci-include/extract.spec.ts
+++ b/lib/manager/gitlabci-include/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const yamlFile = loadFixture('gitlab-ci.1.yaml');
 
-describe(getName(), () => {
+describe('manager/gitlabci-include/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(
diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts
index 1f48752cedc90d871dc60e9443d0a6af6dd582d2..ed316fab8689925962a058df4cc8c4a54ab30883 100644
--- a/lib/manager/gitlabci/extract.spec.ts
+++ b/lib/manager/gitlabci/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, logger } from '../../../test/util';
+import { logger } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import type { ExtractConfig, PackageDependency } from '../types';
@@ -8,7 +8,7 @@ const config: ExtractConfig = {};
 
 const adminConfig: RepoGlobalConfig = { localDir: '' };
 
-describe(getName(), () => {
+describe('manager/gitlabci/extract', () => {
   beforeEach(() => {
     setGlobalConfig(adminConfig);
   });
diff --git a/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap b/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap
index d3178a961b11e86df4cf2bc19fb7e6cdb554dd2c..966b7dd6c0bac5d88463edd3cc8e9bb7ad668daa 100644
--- a/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() catches errors 1`] = `
+exports[`manager/gomod/artifacts catches errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -11,11 +11,11 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() catches errors 2`] = `Array []`;
+exports[`manager/gomod/artifacts catches errors 2`] = `Array []`;
 
-exports[`.updateArtifacts() returns if no go.sum found 1`] = `Array []`;
+exports[`manager/gomod/artifacts returns if no go.sum found 1`] = `Array []`;
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/gomod/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -45,7 +45,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated go.sum 1`] = `
+exports[`manager/gomod/artifacts returns updated go.sum 1`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -75,7 +75,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() skips updating import paths for gopkg.in dependencies 1`] = `
+exports[`manager/gomod/artifacts skips updating import paths for gopkg.in dependencies 1`] = `
 Array [
   Object {
     "file": Object {
@@ -92,7 +92,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() skips updating import paths for gopkg.in dependencies 2`] = `
+exports[`manager/gomod/artifacts skips updating import paths for gopkg.in dependencies 2`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -172,7 +172,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() skips updating import paths with gomodUpdateImportPaths on v0 to v1 1`] = `
+exports[`manager/gomod/artifacts skips updating import paths with gomodUpdateImportPaths on v0 to v1 1`] = `
 Array [
   Object {
     "file": Object {
@@ -189,7 +189,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() skips updating import paths with gomodUpdateImportPaths on v0 to v1 2`] = `
+exports[`manager/gomod/artifacts skips updating import paths with gomodUpdateImportPaths on v0 to v1 2`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -269,7 +269,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports docker mode with credentials 1`] = `
+exports[`manager/gomod/artifacts supports docker mode with credentials 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/go:latest",
@@ -311,7 +311,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports docker mode with goModTidy 1`] = `
+exports[`manager/gomod/artifacts supports docker mode with goModTidy 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/go:latest",
@@ -353,7 +353,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports docker mode without credentials 1`] = `
+exports[`manager/gomod/artifacts supports docker mode without credentials 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/go:latest",
@@ -395,7 +395,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports global mode 1`] = `
+exports[`manager/gomod/artifacts supports global mode 1`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -425,7 +425,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports vendor directory update 1`] = `
+exports[`manager/gomod/artifacts supports vendor directory update 1`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -555,7 +555,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() updates import paths with gomodUpdateImportPaths 1`] = `
+exports[`manager/gomod/artifacts updates import paths with gomodUpdateImportPaths 1`] = `
 Array [
   Object {
     "file": Object {
@@ -578,7 +578,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() updates import paths with gomodUpdateImportPaths 2`] = `
+exports[`manager/gomod/artifacts updates import paths with gomodUpdateImportPaths 2`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -708,7 +708,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() updates import paths with latest tool version on invalid version constraint 1`] = `
+exports[`manager/gomod/artifacts updates import paths with latest tool version on invalid version constraint 1`] = `
 Array [
   Object {
     "file": Object {
@@ -731,7 +731,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() updates import paths with latest tool version on invalid version constraint 2`] = `
+exports[`manager/gomod/artifacts updates import paths with latest tool version on invalid version constraint 2`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
@@ -861,7 +861,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() updates import paths with specific tool version from constraint 1`] = `
+exports[`manager/gomod/artifacts updates import paths with specific tool version from constraint 1`] = `
 Array [
   Object {
     "file": Object {
@@ -884,7 +884,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() updates import paths with specific tool version from constraint 2`] = `
+exports[`manager/gomod/artifacts updates import paths with specific tool version from constraint 2`] = `
 Array [
   Object {
     "cmd": "go get -d ./...",
diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts
index 5f73da355b190a85486464a7730442209b874545..4e56f411790b2da68306caaa3b0285e035bfebfa 100644
--- a/lib/manager/gomod/artifacts.spec.ts
+++ b/lib/manager/gomod/artifacts.spec.ts
@@ -54,7 +54,7 @@ const goEnv = {
   CGO_ENABLED: '1',
 };
 
-describe('.updateArtifacts()', () => {
+describe('manager/gomod/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/gomod/extract.spec.ts b/lib/manager/gomod/extract.spec.ts
index 1de4a0479ae1e49774633a64cb708ace86568869..45889a2c516767f8e6eae2ed8e41a242160f5017 100644
--- a/lib/manager/gomod/extract.spec.ts
+++ b/lib/manager/gomod/extract.spec.ts
@@ -1,11 +1,11 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const gomod1 = loadFixture('1/go.mod');
 const gomod2 = loadFixture('2/go.mod');
 const gomod3 = loadFixture('3/go.mod');
 
-describe(getName(), () => {
+describe('manager/gomod/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/gomod/update.spec.ts b/lib/manager/gomod/update.spec.ts
index 7104f9c3882d2456048c693e7b040e56d9ab51c2..271ebfdd6a2f85f25ade9a855672956deec6991d 100644
--- a/lib/manager/gomod/update.spec.ts
+++ b/lib/manager/gomod/update.spec.ts
@@ -1,11 +1,11 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import type { UpdateType } from '../../config/types';
 import { updateDependency } from './update';
 
 const gomod1 = loadFixture('1/go.mod');
 const gomod2 = loadFixture('2/go.mod');
 
-describe(getName(), () => {
+describe('manager/gomod/update', () => {
   describe('updateDependency', () => {
     it('replaces existing value', () => {
       const upgrade = {
diff --git a/lib/manager/gradle-wrapper/artifacts-real.spec.ts b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
index a464906c71a70b2212ab33e57d2fbfcf4c9501cc..fa522df65013902a8a67682069bf1a56e8afc10a 100644
--- a/lib/manager/gradle-wrapper/artifacts-real.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
@@ -2,7 +2,7 @@ import { readFile, readFileSync } from 'fs-extra';
 import Git from 'simple-git';
 import { resolve } from 'upath';
 import * as httpMock from '../../../test/http-mock';
-import { getName, git, partial } from '../../../test/util';
+import { git, partial } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import type { StatusResult } from '../../util/git';
@@ -36,7 +36,7 @@ function compareFile(file: string, path: string) {
   );
 }
 
-describe(getName(), () => {
+describe('manager/gradle-wrapper/artifacts-real', () => {
   ifSystemSupportsGradle(6).describe('real tests', () => {
     jest.setTimeout(60 * 1000);
 
diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts
index 7e7c5ef2c5e2fade7dc90f4304bdd38d8ec10a20..5ce870f9dcc8341bbcc49479d0c4168ed0cfdb20 100644
--- a/lib/manager/gradle-wrapper/artifacts.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts.spec.ts
@@ -8,7 +8,6 @@ import {
   addReplacingSerializer,
   env,
   fs,
-  getName,
   git,
   partial,
 } from '../../../test/util';
@@ -44,7 +43,7 @@ function readString(...paths: string[]): Promise<string> {
   return readFile(resolve(fixtures, ...paths), 'utf8');
 }
 
-describe(getName(), () => {
+describe('manager/gradle-wrapper/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
 
diff --git a/lib/manager/gradle-wrapper/extract.spec.ts b/lib/manager/gradle-wrapper/extract.spec.ts
index 36c67eef1f4ce831ca6862e1b5e68a99368dd2d7..88fcc584a77745aa4bce25eca58d80fb3bd18fcc 100644
--- a/lib/manager/gradle-wrapper/extract.spec.ts
+++ b/lib/manager/gradle-wrapper/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const propertiesFile1 = loadFixture('gradle-wrapper-1.properties');
@@ -9,7 +9,7 @@ const whitespacePropertiesFile = loadFixture(
   'gradle-wrapper-whitespace.properties'
 );
 
-describe(getName(), () => {
+describe('manager/gradle-wrapper/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/gradle/deep/build-gradle.spec.ts b/lib/manager/gradle/deep/build-gradle.spec.ts
index acb5669319d03f9e626ea57d816177ea6b0b2c3d..f12807a96f1274215c1772c390c7c9382500c816 100644
--- a/lib/manager/gradle/deep/build-gradle.spec.ts
+++ b/lib/manager/gradle/deep/build-gradle.spec.ts
@@ -1,11 +1,10 @@
-import { getName } from '../../../../test/util';
 import {
   collectVersionVariables,
   init,
   updateGradleVersion,
 } from './build-gradle';
 
-describe(getName(), () => {
+describe('manager/gradle/deep/build-gradle', () => {
   beforeEach(() => {
     init();
   });
diff --git a/lib/manager/gradle/deep/gradle-updates-report.spec.ts b/lib/manager/gradle/deep/gradle-updates-report.spec.ts
index 6da98f8651b8ec7d952c9e9709b4f220f410d2c3..45a58fd4f7b42b5ee00be1715f8dbab5360a2d12 100644
--- a/lib/manager/gradle/deep/gradle-updates-report.spec.ts
+++ b/lib/manager/gradle/deep/gradle-updates-report.spec.ts
@@ -1,7 +1,6 @@
 import * as fs from 'fs-extra';
 import tmp, { DirectoryResult } from 'tmp-promise';
 import * as upath from 'upath';
-import { getName } from '../../../../test/util';
 import { exec } from '../../../util/exec';
 import { ifSystemSupportsGradle } from './__testutil__/gradle';
 import {
@@ -13,7 +12,7 @@ import { GRADLE_DEPENDENCY_REPORT_OPTIONS } from '.';
 
 const fixtures = 'lib/manager/gradle/deep/__fixtures__';
 
-describe(getName(), () => {
+describe('manager/gradle/deep/gradle-updates-report', () => {
   for (const gradleVersion of [5, 6]) {
     ifSystemSupportsGradle(gradleVersion).describe(
       'createRenovateGradlePlugin',
diff --git a/lib/manager/gradle/deep/index-real.spec.ts b/lib/manager/gradle/deep/index-real.spec.ts
index 2b7ac2961e570e940af71aed0b68d455bc27996d..7903247d3dbcc0251c17f798d83e3574cfc84eb7 100644
--- a/lib/manager/gradle/deep/index-real.spec.ts
+++ b/lib/manager/gradle/deep/index-real.spec.ts
@@ -1,6 +1,5 @@
 import fsExtra from 'fs-extra';
 import tmp, { DirectoryResult } from 'tmp-promise';
-import { getName } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import type { RepoGlobalConfig } from '../../../config/types';
 import type { ExtractConfig } from '../../types';
@@ -15,7 +14,7 @@ const baseConfig = {
   },
 };
 
-describe(getName(), () => {
+describe('manager/gradle/deep/index-real', () => {
   ifSystemSupportsGradle(6).describe('executeGradle integration', () => {
     const SUCCESS_FILE_NAME = 'success.indicator';
     let workingDir: DirectoryResult;
diff --git a/lib/manager/gradle/deep/index.spec.ts b/lib/manager/gradle/deep/index.spec.ts
index 3a7e22b4cffc4578d8b3073d17291b8730a1151d..14d6defd9b01a061d0118036fa527c1a5125606b 100644
--- a/lib/manager/gradle/deep/index.spec.ts
+++ b/lib/manager/gradle/deep/index.spec.ts
@@ -7,7 +7,6 @@ import { extractAllPackageFiles, updateDependency } from '..';
 import { envMock, mockExecAll } from '../../../../test/exec-util';
 import {
   addReplacingSerializer,
-  getName,
   loadFixture,
   mocked,
 } from '../../../../test/util';
@@ -56,7 +55,7 @@ dependency "baz:baz:\${bazVersion}"
 addReplacingSerializer('gradlew.bat', '<gradlew>');
 addReplacingSerializer('./gradlew', '<gradlew>');
 
-describe(getName(), () => {
+describe('manager/gradle/deep/index', () => {
   const updatesReport = loadFixture('updatesReport.json');
 
   function setupMocks({
diff --git a/lib/manager/gradle/shallow/extract.spec.ts b/lib/manager/gradle/shallow/extract.spec.ts
index 20299d6cef64265e30c5d262ccf5bd03478fb473..1456652cd4e7556c0b086e77a8ea7d46ebf6dd8d 100644
--- a/lib/manager/gradle/shallow/extract.spec.ts
+++ b/lib/manager/gradle/shallow/extract.spec.ts
@@ -1,5 +1,5 @@
 import { extractAllPackageFiles } from '..';
-import { fs, getName } from '../../../../test/util';
+import { fs } from '../../../../test/util';
 
 jest.mock('../../../util/fs');
 
@@ -12,7 +12,7 @@ function mockFs(files: Record<string, string>): void {
   });
 }
 
-describe(getName(), () => {
+describe('manager/gradle/shallow/extract', () => {
   beforeAll(() => {});
   afterAll(() => {
     jest.resetAllMocks();
diff --git a/lib/manager/gradle/shallow/parser.spec.ts b/lib/manager/gradle/shallow/parser.spec.ts
index 169d05865198d1640eb6a005d1ba5050b4714f53..869c092aaea5d5c6c09ad0ab8e62fb9364d41862 100644
--- a/lib/manager/gradle/shallow/parser.spec.ts
+++ b/lib/manager/gradle/shallow/parser.spec.ts
@@ -1,8 +1,8 @@
-import { getName, loadFixture } from '../../../../test/util';
+import { loadFixture } from '../../../../test/util';
 import { GOOGLE_REPO, JCENTER_REPO, MAVEN_REPO } from './common';
 import { parseGradle, parseProps } from './parser';
 
-describe(getName(), () => {
+describe('manager/gradle/shallow/parser', () => {
   it('handles end of input', () => {
     expect(parseGradle('version = ').deps).toBeEmpty();
     expect(parseGradle('id "foo.bar" version').deps).toBeEmpty();
diff --git a/lib/manager/gradle/shallow/tokenizer.spec.ts b/lib/manager/gradle/shallow/tokenizer.spec.ts
index d634cd20c3c7172a6e8ecf9563da7ee02c5d41db..98af7fcb29b6a4ad3379ceb651df0fbdba538a0f 100644
--- a/lib/manager/gradle/shallow/tokenizer.spec.ts
+++ b/lib/manager/gradle/shallow/tokenizer.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../../test/util';
 import { TokenType } from './common';
 import { extractRawTokens, tokenize } from './tokenizer';
 
@@ -6,7 +5,7 @@ function tokenTypes(input): string[] {
   return extractRawTokens(input).map((token) => token.type);
 }
 
-describe(getName(), () => {
+describe('manager/gradle/shallow/tokenizer', () => {
   it('extractTokens', () => {
     const samples = {
       ' ': [TokenType.Space],
diff --git a/lib/manager/gradle/shallow/update.spec.ts b/lib/manager/gradle/shallow/update.spec.ts
index 73e33334ef7a684436bd89e8575da093916166c2..73033ef1c19eb38cbfa5236a995c6b84bf065549 100644
--- a/lib/manager/gradle/shallow/update.spec.ts
+++ b/lib/manager/gradle/shallow/update.spec.ts
@@ -1,7 +1,6 @@
 import { updateDependency } from '..';
-import { getName } from '../../../../test/util';
 
-describe(getName(), () => {
+describe('manager/gradle/shallow/update', () => {
   it('replaces', () => {
     expect(
       updateDependency({
diff --git a/lib/manager/gradle/shallow/utils.spec.ts b/lib/manager/gradle/shallow/utils.spec.ts
index f0eb232c4cf50869d83a0bc3dc1ace56f0d9f17b..eb37b9132caa822302d4eaf39b31b01ac5070629 100644
--- a/lib/manager/gradle/shallow/utils.spec.ts
+++ b/lib/manager/gradle/shallow/utils.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../../test/util';
 import { TokenType } from './common';
 import {
   getVars,
@@ -10,7 +9,7 @@ import {
   versionLikeSubstring,
 } from './utils';
 
-describe(getName(), () => {
+describe('manager/gradle/shallow/utils', () => {
   it('versionLikeSubstring', () => {
     [
       '1.2.3',
diff --git a/lib/manager/helm-requirements/extract.spec.ts b/lib/manager/helm-requirements/extract.spec.ts
index 90b93eecf9a8a5ae9ab5cbe34fcbad2868da74e5..7b26f226a750bf4bc0a78eb1968470e76e5899a5 100644
--- a/lib/manager/helm-requirements/extract.spec.ts
+++ b/lib/manager/helm-requirements/extract.spec.ts
@@ -1,10 +1,10 @@
-import { fs, getName } from '../../../test/util';
+import { fs } from '../../../test/util';
 import { SkipReason } from '../../types';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
 
-describe(getName(), () => {
+describe('manager/helm-requirements/extract', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/helm-values/extract.spec.ts b/lib/manager/helm-values/extract.spec.ts
index a2007abbfd5dfa994700dad04d2e8501e268f603..ed7136829a56f43519d53112f4b27cb05135721c 100644
--- a/lib/manager/helm-values/extract.spec.ts
+++ b/lib/manager/helm-values/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const helmDefaultChartInitValues = loadFixture(
@@ -9,7 +9,7 @@ const helmMultiAndNestedImageValues = loadFixture(
   'multi_and_nested_image_values.yaml'
 );
 
-describe(getName(), () => {
+describe('manager/helm-values/extract', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/helmfile/extract.spec.ts b/lib/manager/helmfile/extract.spec.ts
index 14f6f6f1b48a6e0be13fc96c8a03e760dbb586ec..8e067c29900b45cc453a336863e285dbf367d2a3 100644
--- a/lib/manager/helmfile/extract.spec.ts
+++ b/lib/manager/helmfile/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
 const multidocYaml = loadFixture('multidoc.yaml');
 
-describe(getName(), () => {
+describe('manager/helmfile/extract', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap b/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap
index 0118cbd4b1b0ee2840cb528d38f64bc36dd60b40..fa3a80d86b31f3b2d76a5e8476a0751b60a4976c 100644
--- a/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() catches errors 1`] = `
+exports[`manager/helmv3/artifacts catches errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -11,7 +11,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/helmv3/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "helm dependency update ''",
@@ -34,7 +34,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Chart.lock 1`] = `
+exports[`manager/helmv3/artifacts returns updated Chart.lock 1`] = `
 Array [
   Object {
     "cmd": "helm dependency update ''",
@@ -57,7 +57,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Chart.lock for lockfile maintenance 1`] = `
+exports[`manager/helmv3/artifacts returns updated Chart.lock for lockfile maintenance 1`] = `
 Array [
   Object {
     "cmd": "helm dependency update ''",
@@ -80,7 +80,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Chart.lock with docker 1`] = `
+exports[`manager/helmv3/artifacts returns updated Chart.lock with docker 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/helm",
diff --git a/lib/manager/helmv3/artifacts.spec.ts b/lib/manager/helmv3/artifacts.spec.ts
index 3774464b63c776128d6684d44b5b7c8d59471bb9..152b778cd2758b9f9cc9597ecaed36fd98d677b7 100644
--- a/lib/manager/helmv3/artifacts.spec.ts
+++ b/lib/manager/helmv3/artifacts.spec.ts
@@ -26,7 +26,7 @@ const adminConfig: RepoGlobalConfig = {
 
 const config: UpdateArtifactsConfig = {};
 
-describe('.updateArtifacts()', () => {
+describe('manager/helmv3/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/helmv3/extract.spec.ts b/lib/manager/helmv3/extract.spec.ts
index b09eeae237c45baacde4b52a040452bd14c1eda3..2967db1578c1ee1ac4d2524c0383e50107e4a5fc 100644
--- a/lib/manager/helmv3/extract.spec.ts
+++ b/lib/manager/helmv3/extract.spec.ts
@@ -1,9 +1,9 @@
-import { fs, getName } from '../../../test/util';
+import { fs } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
 
-describe(getName(), () => {
+describe('manager/helmv3/extract', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/helmv3/update.spec.ts b/lib/manager/helmv3/update.spec.ts
index c2aaface074681afaa22a29fd106a74817506738..d157aeb208f0f698fd63fedced8428ac93c5001d 100644
--- a/lib/manager/helmv3/update.spec.ts
+++ b/lib/manager/helmv3/update.spec.ts
@@ -1,8 +1,7 @@
 import { dump } from 'js-yaml';
-import { getName } from '../../../test/util';
 import * as helmv3Updater from './update';
 
-describe(getName(), () => {
+describe('manager/helmv3/update', () => {
   describe('.bumpPackageVersion()', () => {
     const content = dump({
       apiVersion: 'v2',
diff --git a/lib/manager/homebrew/extract.spec.ts b/lib/manager/homebrew/extract.spec.ts
index 3fa19ad8b3a824bab5fac45945b31ed2b96b615a..e6a1be41ae96f2b3089119efd6f52e57b27c8f1c 100644
--- a/lib/manager/homebrew/extract.spec.ts
+++ b/lib/manager/homebrew/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const aalib = loadFixture('aalib.rb');
@@ -7,7 +7,7 @@ const acmetool = loadFixture('acmetool.rb');
 const aide = loadFixture('aide.rb');
 const ibazel = loadFixture('ibazel.rb');
 
-describe(getName(), () => {
+describe('manager/homebrew/extract', () => {
   describe('extractPackageFile()', () => {
     it('skips sourceforge dependency 1', () => {
       const res = extractPackageFile(aalib);
diff --git a/lib/manager/homebrew/update.spec.ts b/lib/manager/homebrew/update.spec.ts
index 44b6618413cd7f161eb9a96d20265c730550ffff..d187c40dfc38e7798bcdd5a4f09da7cd658451e4 100644
--- a/lib/manager/homebrew/update.spec.ts
+++ b/lib/manager/homebrew/update.spec.ts
@@ -1,6 +1,6 @@
 import { Readable } from 'stream';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { updateDependency } from './update';
 
 const aide = loadFixture('aide.rb');
@@ -8,7 +8,7 @@ const ibazel = loadFixture('ibazel.rb');
 
 const baseUrl = 'https://github.com';
 
-describe(getName(), () => {
+describe('manager/homebrew/update', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/homebrew/util.spec.ts b/lib/manager/homebrew/util.spec.ts
index c29346a2f0c9fe73f18ae9beccebfd76051f93e8..f602cefe1dcc0b681ab9b8f87b8b18d648f9b92c 100644
--- a/lib/manager/homebrew/util.spec.ts
+++ b/lib/manager/homebrew/util.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { skip } from './util';
 
-describe(getName(), () => {
+describe('manager/homebrew/util', () => {
   describe('skip()', () => {
     it('handles out of bounds case', () => {
       const content = 'some content';
diff --git a/lib/manager/html/extract.spec.ts b/lib/manager/html/extract.spec.ts
index df81548e67eaaaba85d2df20e881d6e3ad869c27..673ab2caad616ffb6b46a827ef267c3cfeea3222 100644
--- a/lib/manager/html/extract.spec.ts
+++ b/lib/manager/html/extract.spec.ts
@@ -1,10 +1,10 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
 const sample = loadFixture(`sample.html`);
 const nothing = loadFixture(`nothing.html`);
 
-describe(getName(), () => {
+describe('manager/html/extract', () => {
   it('extractPackageFile', () => {
     // FIXME: explicit assert condition
     expect(extractPackageFile(sample)).toMatchSnapshot();
diff --git a/lib/manager/index.spec.ts b/lib/manager/index.spec.ts
index 3abf45a4ebdc36c4a1049960f401361ff04ea719..36bdc755041541251b8d56e372b2e3d10c593200 100644
--- a/lib/manager/index.spec.ts
+++ b/lib/manager/index.spec.ts
@@ -1,9 +1,8 @@
-import { getName } from '../../test/util';
 import { loadModules } from '../util/modules';
 import type { ManagerApi } from './types';
 import * as manager from '.';
 
-describe(getName(), () => {
+describe('manager/index', () => {
   describe('get()', () => {
     it('gets something', () => {
       expect(manager.get('dockerfile', 'extractPackageFile')).not.toBeNull();
diff --git a/lib/manager/jenkins/extract.spec.ts b/lib/manager/jenkins/extract.spec.ts
index 8163a935022cc289c34972f3594ca2061e063b4b..7f0e163b8d40847e4fbdd7f93d35ae3d8eaf6154 100644
--- a/lib/manager/jenkins/extract.spec.ts
+++ b/lib/manager/jenkins/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const invalidYamlFile = loadFixture('invalid.yaml');
@@ -9,7 +9,7 @@ const pluginsYamlFile = loadFixture('plugins.yaml');
 const pluginsEmptyTextFile = loadFixture('empty.txt');
 const pluginsEmptyYamlFile = loadFixture('empty.yaml');
 
-describe(getName(), () => {
+describe('manager/jenkins/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns empty list for an empty text file', () => {
       const res = extractPackageFile(pluginsEmptyTextFile, 'path/file.txt');
diff --git a/lib/manager/kubernetes/extract.spec.ts b/lib/manager/kubernetes/extract.spec.ts
index fa7f3b1f63a81052d73d7ce9a7aa10a1376aa92a..69b1296515aeea131fe55235cc5234caad72ddca 100644
--- a/lib/manager/kubernetes/extract.spec.ts
+++ b/lib/manager/kubernetes/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const kubernetesImagesFile = loadFixture('kubernetes.yaml');
@@ -6,7 +6,7 @@ const kubernetesConfigMapFile = loadFixture('configmap.yaml');
 const kubernetesArraySyntaxFile = loadFixture('array-syntax.yaml');
 const otherYamlFile = loadFixture('gitlab-ci.yaml');
 
-describe(getName(), () => {
+describe('manager/kubernetes/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile(kubernetesConfigMapFile)).toBeNull();
diff --git a/lib/manager/kustomize/extract.spec.ts b/lib/manager/kustomize/extract.spec.ts
index 4f2d7a39b5ea9c202f1d60f51f647f6f1ae3d98f..afc8c93321e0320218f87209d85e8ad86687b8f9 100644
--- a/lib/manager/kustomize/extract.spec.ts
+++ b/lib/manager/kustomize/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import * as datasourceDocker from '../../datasource/docker';
 import * as datasourceGitTags from '../../datasource/git-tags';
 import * as datasourceGitHubTags from '../../datasource/github-tags';
@@ -21,7 +21,7 @@ const gitImages = loadFixture('gitImages.yaml');
 const kustomizeDepsInResources = loadFixture('depsInResources.yaml');
 const sha = loadFixture('sha.yaml');
 
-describe(getName(), () => {
+describe('manager/kustomize/extract', () => {
   it('should successfully parse a valid kustomize file', () => {
     const file = parseKustomize(kustomizeGitSSHBase);
     expect(file).not.toBeNull();
diff --git a/lib/manager/leiningen/extract.spec.ts b/lib/manager/leiningen/extract.spec.ts
index 0f823c7b67c7248751c941be65eab09e291c906c..d32d9af17bc4a373163dbdaba6234643603ce939 100644
--- a/lib/manager/leiningen/extract.spec.ts
+++ b/lib/manager/leiningen/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { ClojureDatasource } from '../../datasource/clojure';
 import {
   extractFromVectors,
@@ -9,7 +9,7 @@ import {
 
 const leinProjectClj = loadFixture(`project.clj`);
 
-describe(getName(), () => {
+describe('manager/leiningen/extract', () => {
   it('trimAtKey', () => {
     expect(trimAtKey('foo', 'bar')).toBeNull();
     expect(trimAtKey(':dependencies    ', 'dependencies')).toBeNull();
diff --git a/lib/manager/maven/extract.spec.ts b/lib/manager/maven/extract.spec.ts
index e36edd51d4951eefc01e5db042a8c1d313b18a6d..13955a2a6137698bf7b4ef8cdd522c72ede8b9b3 100644
--- a/lib/manager/maven/extract.spec.ts
+++ b/lib/manager/maven/extract.spec.ts
@@ -1,11 +1,11 @@
 /* eslint-disable no-template-curly-in-string */
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackage } from './extract';
 
 const minimumContent = loadFixture(`minimum.pom.xml`);
 const simpleContent = loadFixture(`simple.pom.xml`);
 
-describe(getName(), () => {
+describe('manager/maven/extract', () => {
   describe('extractDependencies', () => {
     it('returns null for invalid XML', () => {
       expect(extractPackage(undefined)).toBeNull();
diff --git a/lib/manager/maven/index.spec.ts b/lib/manager/maven/index.spec.ts
index 8b724113ee96ee9a3670c7dcd6d43dec3452813a..df1ee2d402d40af11b6a633c095b9e8444b5a0b2 100644
--- a/lib/manager/maven/index.spec.ts
+++ b/lib/manager/maven/index.spec.ts
@@ -1,4 +1,4 @@
-import { fs, getName, loadFixture } from '../../../test/util';
+import { fs, loadFixture } from '../../../test/util';
 import type { PackageDependency, PackageFile } from '../types';
 import { extractPackage, resolveParents } from './extract';
 import { extractAllPackageFiles, updateDependency } from '.';
@@ -14,7 +14,7 @@ function selectDep(deps: PackageDependency[], name = 'org.example:quuz') {
   return deps.find((dep) => dep.depName === name);
 }
 
-describe(getName(), () => {
+describe('manager/maven/index', () => {
   describe('extractAllPackageFiles', () => {
     it('should return empty if package has no content', async () => {
       fs.readLocalFile.mockResolvedValueOnce(null);
diff --git a/lib/manager/metadata.spec.ts b/lib/manager/metadata.spec.ts
index 1af7018fb28f348e49402aee228ad682ac18af68..d5f2aaecc81d349615bcf318f41a6d5d13b755d6 100644
--- a/lib/manager/metadata.spec.ts
+++ b/lib/manager/metadata.spec.ts
@@ -1,6 +1,6 @@
 import * as fs from 'fs-extra';
 
-describe('manager metadata', () => {
+describe('manager/metadata', () => {
   const managerList: string[] = fs
     .readdirSync(__dirname, { withFileTypes: true })
     .filter((dirent) => dirent.isDirectory())
diff --git a/lib/manager/meteor/extract.spec.ts b/lib/manager/meteor/extract.spec.ts
index 1af6bd74200368be0b0350461e466cb419cbe489..cca697ee10d8d960e8bd0a81ec272fc092e37373 100644
--- a/lib/manager/meteor/extract.spec.ts
+++ b/lib/manager/meteor/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const input01Content = loadFixture('package-1.js');
 
-describe(getName(), () => {
+describe('manager/meteor/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns empty if fails to parse', () => {
       const res = extractPackageFile('blahhhhh:foo:@what\n');
diff --git a/lib/manager/mix/artifacts.spec.ts b/lib/manager/mix/artifacts.spec.ts
index 12ce2ee98031948cf8077bc2da3d5687689a3852..0878c42962afc97b4ebf09877d1f39aa96fa1e08 100644
--- a/lib/manager/mix/artifacts.spec.ts
+++ b/lib/manager/mix/artifacts.spec.ts
@@ -1,6 +1,6 @@
 import { join } from 'upath';
 import { envMock, exec, mockExecAll } from '../../../test/exec-util';
-import { env, fs, getName, hostRules } from '../../../test/util';
+import { env, fs, hostRules } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import * as docker from '../../util/exec/docker';
@@ -19,7 +19,7 @@ const adminConfig: RepoGlobalConfig = {
 
 const config: UpdateArtifactsConfig = {};
 
-describe(getName(), () => {
+describe('manager/mix/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/mix/extract.spec.ts b/lib/manager/mix/extract.spec.ts
index 157d052c17f3dbab6bd5e71d1705e981fc191c7d..1e6636a492679bf64e37ed92689c02630fbc6a8c 100644
--- a/lib/manager/mix/extract.spec.ts
+++ b/lib/manager/mix/extract.spec.ts
@@ -1,10 +1,10 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import { extractPackageFile } from '.';
 
 const sample = loadFixture('mix.exs');
 
-describe(getName(), () => {
+describe('manager/mix/extract', () => {
   beforeEach(() => {
     setGlobalConfig({ localDir: '' });
   });
diff --git a/lib/manager/nodenv/extract.spec.ts b/lib/manager/nodenv/extract.spec.ts
index a4058e4787a481a51b9b1f03790c8d0679c08510..65b8ec4beaa87511a009f7e30a9090a17d4e07dd 100644
--- a/lib/manager/nodenv/extract.spec.ts
+++ b/lib/manager/nodenv/extract.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-describe(getName(), () => {
+describe('manager/nodenv/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns a result', () => {
       const res = extractPackageFile('8.4.0\n');
diff --git a/lib/manager/npm/extract/index.spec.ts b/lib/manager/npm/extract/index.spec.ts
index 92ef4ee553621bd12c25be7fd0312b17a0fde320..9b77cf11a5bd9589c50916d95e51f79d5282855c 100644
--- a/lib/manager/npm/extract/index.spec.ts
+++ b/lib/manager/npm/extract/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../../test/util';
+import { loadFixture } from '../../../../test/util';
 import { getConfig } from '../../../config/defaults';
 import * as _fs from '../../../util/fs';
 import * as npmExtract from '.';
@@ -18,7 +18,7 @@ const workspacesSimpleContent = loadFixture(
 const vendorisedContent = loadFixture('is-object.json', '..');
 const invalidNameContent = loadFixture('invalid-name.json', '..');
 
-describe(getName(), () => {
+describe('manager/npm/extract/index', () => {
   describe('.extractPackageFile()', () => {
     beforeEach(() => {
       fs.readLocalFile = jest.fn(() => null);
diff --git a/lib/manager/npm/extract/locked-versions.spec.ts b/lib/manager/npm/extract/locked-versions.spec.ts
index 471d3042a8e3dfb810dbe6b3f27e1c00b1efa92e..2a1d5f5eb0f2dc8c36ff604ea7b659b457e1a2d2 100644
--- a/lib/manager/npm/extract/locked-versions.spec.ts
+++ b/lib/manager/npm/extract/locked-versions.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../../test/util';
 import { getLockedVersions } from './locked-versions';
 
 /** @type any */
@@ -9,7 +8,7 @@ const yarn = require('./yarn');
 jest.mock('./npm');
 jest.mock('./yarn');
 
-describe(getName(), () => {
+describe('manager/npm/extract/locked-versions', () => {
   describe('.getLockedVersions()', () => {
     it.each([['1.22.0'], ['2.1.0'], ['2.2.0']])(
       'uses yarn.lock with yarn v%s',
diff --git a/lib/manager/npm/extract/monorepo.spec.ts b/lib/manager/npm/extract/monorepo.spec.ts
index 0d5faf4bec4553ec4dba75f4c7fe86f0fbb39043..8fd569946f77193d64ebadadf71fe8bf40412a4e 100644
--- a/lib/manager/npm/extract/monorepo.spec.ts
+++ b/lib/manager/npm/extract/monorepo.spec.ts
@@ -1,9 +1,8 @@
-import { getName } from '../../../../test/util';
 import { detectMonorepos } from './monorepo';
 
 jest.mock('./pnpm');
 
-describe(getName(), () => {
+describe('manager/npm/extract/monorepo', () => {
   describe('.extractPackageFile()', () => {
     it('uses lerna package settings', async () => {
       const packageFiles = [
diff --git a/lib/manager/npm/extract/npm.spec.ts b/lib/manager/npm/extract/npm.spec.ts
index 14f37a68d5e315326f579be5b4e57821f61e78bb..8e704676f4bd408dd303b357b03bf123d3a1df16 100644
--- a/lib/manager/npm/extract/npm.spec.ts
+++ b/lib/manager/npm/extract/npm.spec.ts
@@ -1,9 +1,9 @@
-import { fs, getName, loadFixture } from '../../../../test/util';
+import { fs, loadFixture } from '../../../../test/util';
 import { getNpmLock } from './npm';
 
 jest.mock('../../../util/fs');
 
-describe(getName(), () => {
+describe('manager/npm/extract/npm', () => {
   describe('.getNpmLock()', () => {
     it('returns empty if failed to parse', async () => {
       fs.readLocalFile.mockResolvedValueOnce('abcd');
diff --git a/lib/manager/npm/extract/pnpm.spec.ts b/lib/manager/npm/extract/pnpm.spec.ts
index 9f686080993aa748dcd2b131aca7bb5d925dc2a5..03fb0863ad7697959902eba4e8242b1361a15fed 100644
--- a/lib/manager/npm/extract/pnpm.spec.ts
+++ b/lib/manager/npm/extract/pnpm.spec.ts
@@ -1,5 +1,5 @@
 import yaml from 'js-yaml';
-import { getFixturePath, getName, logger } from '../../../../test/util';
+import { getFixturePath, logger } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import * as fs from '../../../util/fs';
 import {
@@ -8,7 +8,7 @@ import {
   findPnpmWorkspace,
 } from './pnpm';
 
-describe(getName(), () => {
+describe('manager/npm/extract/pnpm', () => {
   beforeAll(() => {
     setGlobalConfig({ localDir: getFixturePath('pnpm-monorepo/', '..') });
   });
diff --git a/lib/manager/npm/extract/type.spec.ts b/lib/manager/npm/extract/type.spec.ts
index 21cc35562b704a07f8f212e2ca50737166dae199..4d7901c307252e0e4c6527ce3d1ae6cf9c6b68d9 100644
--- a/lib/manager/npm/extract/type.spec.ts
+++ b/lib/manager/npm/extract/type.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../../test/util';
 import { mightBeABrowserLibrary } from './type';
 
-describe(getName(), () => {
+describe('manager/npm/extract/type', () => {
   describe('.mightBeABrowserLibrary()', () => {
     it('is not a library if private', () => {
       const isLibrary = mightBeABrowserLibrary({ private: true });
diff --git a/lib/manager/npm/extract/utils.spec.ts b/lib/manager/npm/extract/utils.spec.ts
index a818ae5b435f6bff0db081ef38f14a5a8694b744..e0f5e3d20f82d402fd66f2fad866655d40ce5357 100644
--- a/lib/manager/npm/extract/utils.spec.ts
+++ b/lib/manager/npm/extract/utils.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../../test/util';
 import { matchesAnyPattern } from './utils';
 
-describe(getName(), () => {
+describe('manager/npm/extract/utils', () => {
   describe('.matchesAnyPattern()', () => {
     it('matches package in nested directory', () => {
       const packageFile = 'packages/group/a/package.json';
diff --git a/lib/manager/npm/extract/yarn.spec.ts b/lib/manager/npm/extract/yarn.spec.ts
index 4a8ad30f8677dc9863614fd144cbfdc4fb93693d..76ddd005c3f027b164bd6a51d6345e49feca38ec 100644
--- a/lib/manager/npm/extract/yarn.spec.ts
+++ b/lib/manager/npm/extract/yarn.spec.ts
@@ -1,9 +1,9 @@
-import { fs, getName, loadFixture } from '../../../../test/util';
+import { fs, loadFixture } from '../../../../test/util';
 import { getYarnLock } from './yarn';
 
 jest.mock('../../../util/fs');
 
-describe(getName(), () => {
+describe('manager/npm/extract/yarn', () => {
   describe('.getYarnLock()', () => {
     it('returns empty if exception parsing', async () => {
       fs.readLocalFile.mockResolvedValueOnce('abcd');
diff --git a/lib/manager/npm/post-update/__snapshots__/npm.spec.ts.snap b/lib/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
index bba9f265872a67a30c4d8d5325d9589e02b7f2c6..0abab7674b2c197d47eae457d7582f0990bf0590 100644
--- a/lib/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
+++ b/lib/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
@@ -1,10 +1,10 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`generateLockFile catches errors 1`] = `Array []`;
+exports[`manager/npm/post-update/npm catches errors 1`] = `Array []`;
 
-exports[`generateLockFile finds npm globally 1`] = `Array []`;
+exports[`manager/npm/post-update/npm finds npm globally 1`] = `Array []`;
 
-exports[`generateLockFile generates lock files 1`] = `
+exports[`manager/npm/post-update/npm generates lock files 1`] = `
 Array [
   Object {
     "cmd": "npm install --no-audit --ignore-scripts",
@@ -45,9 +45,9 @@ Array [
 ]
 `;
 
-exports[`generateLockFile performs full install 1`] = `Array []`;
+exports[`manager/npm/post-update/npm performs full install 1`] = `Array []`;
 
-exports[`generateLockFile performs lock file maintenance 1`] = `
+exports[`manager/npm/post-update/npm performs lock file maintenance 1`] = `
 Array [
   Object {
     "cmd": "npm install --package-lock-only --no-audit --ignore-scripts",
@@ -70,7 +70,7 @@ Array [
 ]
 `;
 
-exports[`generateLockFile performs lock file updates 1`] = `
+exports[`manager/npm/post-update/npm performs lock file updates 1`] = `
 Array [
   Object {
     "cmd": "npm install --package-lock-only --no-audit --ignore-scripts some-dep@1.0.1",
@@ -93,8 +93,8 @@ Array [
 ]
 `;
 
-exports[`generateLockFile performs npm-shrinkwrap.json updates (no package-lock.json) 1`] = `Array []`;
+exports[`manager/npm/post-update/npm performs npm-shrinkwrap.json updates (no package-lock.json) 1`] = `Array []`;
 
-exports[`generateLockFile performs npm-shrinkwrap.json updates 1`] = `Array []`;
+exports[`manager/npm/post-update/npm performs npm-shrinkwrap.json updates 1`] = `Array []`;
 
-exports[`generateLockFile uses docker npm 1`] = `Array []`;
+exports[`manager/npm/post-update/npm uses docker npm 1`] = `Array []`;
diff --git a/lib/manager/npm/post-update/__snapshots__/pnpm.spec.ts.snap b/lib/manager/npm/post-update/__snapshots__/pnpm.spec.ts.snap
index 7a6094cd1eafb8d84a2e8ced52c01b0b2261e6b5..5a51f42435ec5d2f711dda44e7285257d8cb2999 100644
--- a/lib/manager/npm/post-update/__snapshots__/pnpm.spec.ts.snap
+++ b/lib/manager/npm/post-update/__snapshots__/pnpm.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`generateLockFile catches errors 1`] = `
+exports[`manager/npm/post-update/pnpm catches errors 1`] = `
 Array [
   Object {
     "cmd": "pnpm install --recursive --lockfile-only --ignore-scripts --ignore-pnpmfile",
@@ -23,7 +23,7 @@ Array [
 ]
 `;
 
-exports[`generateLockFile finds pnpm globally 1`] = `
+exports[`manager/npm/post-update/pnpm finds pnpm globally 1`] = `
 Array [
   Object {
     "cmd": "pnpm install --recursive --lockfile-only --ignore-scripts --ignore-pnpmfile",
@@ -46,7 +46,7 @@ Array [
 ]
 `;
 
-exports[`generateLockFile generates lock files 1`] = `
+exports[`manager/npm/post-update/pnpm generates lock files 1`] = `
 Array [
   Object {
     "cmd": "pnpm install --recursive --lockfile-only --ignore-scripts --ignore-pnpmfile",
@@ -69,7 +69,7 @@ Array [
 ]
 `;
 
-exports[`generateLockFile performs lock file maintenance 1`] = `
+exports[`manager/npm/post-update/pnpm performs lock file maintenance 1`] = `
 Array [
   Object {
     "cmd": "pnpm install --recursive --lockfile-only --ignore-scripts --ignore-pnpmfile",
diff --git a/lib/manager/npm/post-update/lerna.spec.ts b/lib/manager/npm/post-update/lerna.spec.ts
index 5a7fd03c05053c40fb19ac6820593b22e48523fd..8ce00a043f1923a77683bea1cde4bebe63719fa9 100644
--- a/lib/manager/npm/post-update/lerna.spec.ts
+++ b/lib/manager/npm/post-update/lerna.spec.ts
@@ -1,6 +1,6 @@
 import { exec as _exec } from 'child_process';
 import { envMock, mockExecAll } from '../../../../test/exec-util';
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import * as _env from '../../../util/exec/env';
 import * as _lernaHelper from './lerna';
@@ -25,7 +25,7 @@ function lernaPkgFileWithoutLernaDep(lernaClient: string) {
     lernaClient,
   };
 }
-describe(getName(), () => {
+describe('manager/npm/post-update/lerna', () => {
   describe('generateLockFiles()', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/npm/post-update/node-version.spec.ts b/lib/manager/npm/post-update/node-version.spec.ts
index a73bf616aec38d6e6ba1122f6b64deb6f974f8da..08db7fa911014b2c1ef7ebd5337d3e50ae1c81f2 100644
--- a/lib/manager/npm/post-update/node-version.spec.ts
+++ b/lib/manager/npm/post-update/node-version.spec.ts
@@ -4,7 +4,7 @@ import { getNodeConstraint } from './node-version';
 
 jest.mock('../../../util/fs');
 
-describe('getNodeConstraint', () => {
+describe('manager/npm/post-update/node-version', () => {
   const config = {
     packageFile: 'package.json',
     constraints: { node: '^12.16.0' },
diff --git a/lib/manager/npm/post-update/npm.spec.ts b/lib/manager/npm/post-update/npm.spec.ts
index 5add5ecd82691a1da9e4daa37b9fcf3ae7d135a4..11a29496206faa8dee593fa9981cb4ae4b533161 100644
--- a/lib/manager/npm/post-update/npm.spec.ts
+++ b/lib/manager/npm/post-update/npm.spec.ts
@@ -16,7 +16,7 @@ const exec: jest.Mock<typeof _exec> = _exec as any;
 const env = mocked(_env);
 const fs = mocked(_fs);
 
-describe('generateLockFile', () => {
+describe('manager/npm/post-update/npm', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/npm/post-update/pnpm.spec.ts b/lib/manager/npm/post-update/pnpm.spec.ts
index 195690f3d41cf7d688726c87e2417a77135c5338..fa9822cc634afc685e7577d826d83bc0d263fd4b 100644
--- a/lib/manager/npm/post-update/pnpm.spec.ts
+++ b/lib/manager/npm/post-update/pnpm.spec.ts
@@ -17,7 +17,7 @@ const fs = mocked(_fs);
 const pnpmHelper = mocked(_pnpmHelper);
 delete process.env.NPM_CONFIG_CACHE;
 
-describe('generateLockFile', () => {
+describe('manager/npm/post-update/pnpm', () => {
   let config: PostUpdateConfig;
   beforeEach(() => {
     config = { cacheDir: 'some-cache-dir', constraints: { pnpm: '^2.0.0' } };
diff --git a/lib/manager/npm/post-update/rules.spec.ts b/lib/manager/npm/post-update/rules.spec.ts
index 2757e87fd4e635e201f903ffe9eb4b3e7d8b1222..9406b335d7ef90d1b15e581c09415dc2d4ef4b1b 100644
--- a/lib/manager/npm/post-update/rules.spec.ts
+++ b/lib/manager/npm/post-update/rules.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../../test/util';
 import * as hostRules from '../../../util/host-rules';
 import { processHostRules } from './rules';
 
-describe(getName(), () => {
+describe('manager/npm/post-update/rules', () => {
   describe('processHostRules()', () => {
     beforeEach(() => {
       hostRules.clear();
diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts
index 87cfb3cfedc7c10ca3e568bec597abeab8f798d1..bf3beecd67ba5115dfbeaf1459b5cbee990ed063 100644
--- a/lib/manager/npm/post-update/yarn.spec.ts
+++ b/lib/manager/npm/post-update/yarn.spec.ts
@@ -4,7 +4,7 @@ import {
   envMock,
   mockExecAll,
 } from '../../../../test/exec-util';
-import { fs, getName, mocked } from '../../../../test/util';
+import { fs, mocked } from '../../../../test/util';
 import * as _env from '../../../util/exec/env';
 import * as _yarnHelper from './yarn';
 
@@ -26,7 +26,7 @@ const fixSnapshots = (snapshots: ExecSnapshots): ExecSnapshots =>
     cmd: snapshot.cmd.replace(/^.*\/yarn.*?\.js\s+/, '<yarn> '),
   }));
 
-describe(getName(), () => {
+describe('manager/npm/post-update/yarn', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/npm/range.spec.ts b/lib/manager/npm/range.spec.ts
index ad3a1aaf712487f48c3c3418c651e335f423ed18..89bda5778ae90695c7b55fee6466fd0168c73222 100644
--- a/lib/manager/npm/range.spec.ts
+++ b/lib/manager/npm/range.spec.ts
@@ -1,7 +1,7 @@
 import type { RangeConfig } from '../types';
 import { getRangeStrategy } from '.';
 
-describe('getRangeStrategy', () => {
+describe('manager/npm/range', () => {
   it('returns same if not auto', () => {
     const config: RangeConfig = { rangeStrategy: 'widen' };
     expect(getRangeStrategy(config)).toEqual('widen');
diff --git a/lib/manager/npm/update/dependency/index.spec.ts b/lib/manager/npm/update/dependency/index.spec.ts
index 4d6d904a37ea7d74eabffc74cf8920b1fcbf8b90..0d81ce7cf60e48ac0fa3a240a9759dd2c6c32c6d 100644
--- a/lib/manager/npm/update/dependency/index.spec.ts
+++ b/lib/manager/npm/update/dependency/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../../../test/util';
+import { loadFixture } from '../../../../../test/util';
 import * as npmUpdater from '.';
 
 const readFixture = (x: string): string => loadFixture(x, '../..');
@@ -6,7 +6,7 @@ const readFixture = (x: string): string => loadFixture(x, '../..');
 const input01Content = readFixture('inputs/01.json');
 const input01GlobContent = readFixture('inputs/01-glob.json');
 
-describe(getName(), () => {
+describe('manager/npm/update/dependency/index', () => {
   describe('.updateDependency(fileContent, depType, depName, newValue)', () => {
     it('replaces a dependency value', () => {
       const upgrade = {
diff --git a/lib/manager/npm/update/locked-dependency/dep-constraints.spec.ts b/lib/manager/npm/update/locked-dependency/dep-constraints.spec.ts
index 172fce3c5720637fbb5587bf9de2b4e9b1124766..d5c7effca9b3be819a85ad205618efbf29dae97b 100644
--- a/lib/manager/npm/update/locked-dependency/dep-constraints.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/dep-constraints.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadJsonFixture } from '../../../../../test/util';
+import { loadJsonFixture } from '../../../../../test/util';
 import { findDepConstraints } from './dep-constraints';
 
 jest.mock('../../../../util/fs');
@@ -6,7 +6,7 @@ jest.mock('../../../../util/fs');
 const packageJson = loadJsonFixture('package.json');
 const packageLockJson = loadJsonFixture('package-lock.json');
 
-describe(getName(), () => {
+describe('manager/npm/update/locked-dependency/dep-constraints', () => {
   describe('findDepConstraints()', () => {
     it('finds indirect dependency', () => {
       // FIXME: explicit assert condition
diff --git a/lib/manager/npm/update/locked-dependency/get-locked.spec.ts b/lib/manager/npm/update/locked-dependency/get-locked.spec.ts
index 9b2f4a6507228f3ca3d4b6667c771144ab0d0533..1c0ad4c656290dbb670fe0eee2dc0613caddf1c9 100644
--- a/lib/manager/npm/update/locked-dependency/get-locked.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/get-locked.spec.ts
@@ -1,11 +1,11 @@
-import { getName, loadJsonFixture } from '../../../../../test/util';
+import { loadJsonFixture } from '../../../../../test/util';
 import { getLockedDependencies } from './get-locked';
 
 jest.mock('../../../../util/fs');
 
 const packageLockJson = loadJsonFixture('package-lock.json');
 
-describe(getName(), () => {
+describe('manager/npm/update/locked-dependency/get-locked', () => {
   describe('getLockedDependencies()', () => {
     it('handles error', () => {
       expect(getLockedDependencies(null as any, 'some-dep', '1.0.0')).toEqual(
diff --git a/lib/manager/npm/update/locked-dependency/index.spec.ts b/lib/manager/npm/update/locked-dependency/index.spec.ts
index 36a688f6ab1a9a507fcab91f136f17f39b33009f..910b6713d746ed1600fb4d5a65d43ea2ffa0a10d 100644
--- a/lib/manager/npm/update/locked-dependency/index.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/index.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../../../../test/http-mock';
-import { getName, loadFixture } from '../../../../../test/util';
+import { loadFixture } from '../../../../../test/util';
 import { clone } from '../../../../util/clone';
 import type { UpdateLockedConfig } from '../../../types';
 import { updateLockedDependency } from '.';
@@ -13,7 +13,7 @@ const serveStaticJson = JSON.parse(loadFixture('serve-static.json'));
 const sendJson = JSON.parse(loadFixture('send.json'));
 const typeIsJson = JSON.parse(loadFixture('type-is.json'));
 
-describe(getName(), () => {
+describe('manager/npm/update/locked-dependency/index', () => {
   describe('updateLockedDependency()', () => {
     let config: UpdateLockedConfig;
     beforeEach(() => {
diff --git a/lib/manager/npm/update/locked-dependency/parent-version.spec.ts b/lib/manager/npm/update/locked-dependency/parent-version.spec.ts
index 5e9801319376cda41c366694307e4f11557f7034..b69240da05c2cd8090009dab7c429cb76f2ac4af 100644
--- a/lib/manager/npm/update/locked-dependency/parent-version.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/parent-version.spec.ts
@@ -1,10 +1,10 @@
 import * as httpMock from '../../../../../test/http-mock';
-import { getName, loadJsonFixture } from '../../../../../test/util';
+import { loadJsonFixture } from '../../../../../test/util';
 import { findFirstParentVersion } from './parent-version';
 
 const expressJson = loadJsonFixture('express.json');
 
-describe(getName(), () => {
+describe('manager/npm/update/locked-dependency/parent-version', () => {
   describe('getLockedDependencies()', () => {
     it('finds indirect dependency', async () => {
       httpMock
diff --git a/lib/manager/npm/update/package-version/index.spec.ts b/lib/manager/npm/update/package-version/index.spec.ts
index 6df6e27549e97980e99dc182cc2a34d089926264..4a724ae0859924068e2fb908d3b69922c8e990fe 100644
--- a/lib/manager/npm/update/package-version/index.spec.ts
+++ b/lib/manager/npm/update/package-version/index.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../../../test/util';
 import * as npmUpdater from '.';
 
-describe(getName(), () => {
+describe('manager/npm/update/package-version/index', () => {
   describe('.bumpPackageVersion()', () => {
     const content = JSON.stringify({
       name: 'some-package',
diff --git a/lib/manager/nuget/__snapshots__/artifacts.spec.ts.snap b/lib/manager/nuget/__snapshots__/artifacts.spec.ts.snap
index 24488ed845f3cbc46224fde72f1a0786b198c8e8..da697c5b33d1494c099c014781ba2cc03716fa4f 100644
--- a/lib/manager/nuget/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/nuget/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`updateArtifacts aborts if lock file is unchanged 1`] = `
+exports[`manager/nuget/artifacts aborts if lock file is unchanged 1`] = `
 Array [
   Object {
     "cmd": "dotnet restore project.csproj --force-evaluate --configfile others/nuget/not-so-random/nuget.config",
@@ -23,9 +23,9 @@ Array [
 ]
 `;
 
-exports[`updateArtifacts aborts if no lock file found 1`] = `Array []`;
+exports[`manager/nuget/artifacts aborts if no lock file found 1`] = `Array []`;
 
-exports[`updateArtifacts authenticates at registries 1`] = `
+exports[`manager/nuget/artifacts authenticates at registries 1`] = `
 Array [
   Object {
     "cmd": "dotnet nuget add source https://my-registry.example.org/ --configfile others/nuget/not-so-random/nuget.config --name myRegistry --username some-username --password some-password --store-password-in-clear-text",
@@ -66,7 +66,7 @@ Array [
 ]
 `;
 
-exports[`updateArtifacts catches errors 1`] = `
+exports[`manager/nuget/artifacts catches errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -77,11 +77,11 @@ Array [
 ]
 `;
 
-exports[`updateArtifacts does not update lock file when no deps changed 1`] = `Array []`;
+exports[`manager/nuget/artifacts does not update lock file when no deps changed 1`] = `Array []`;
 
-exports[`updateArtifacts does not update lock file when non-proj file is changed 1`] = `Array []`;
+exports[`manager/nuget/artifacts does not update lock file when non-proj file is changed 1`] = `Array []`;
 
-exports[`updateArtifacts performs lock file maintenance 1`] = `
+exports[`manager/nuget/artifacts performs lock file maintenance 1`] = `
 Array [
   Object {
     "cmd": "dotnet restore project.csproj --force-evaluate --configfile others/nuget/not-so-random/nuget.config",
@@ -104,7 +104,7 @@ Array [
 ]
 `;
 
-exports[`updateArtifacts strips protocol version from feed url 1`] = `
+exports[`manager/nuget/artifacts strips protocol version from feed url 1`] = `
 Array [
   Object {
     "cmd": "dotnet nuget add source https://my-registry.example.org/ --configfile others/nuget/not-so-random/nuget.config --name myRegistry",
@@ -145,7 +145,7 @@ Array [
 ]
 `;
 
-exports[`updateArtifacts supports docker mode 1`] = `
+exports[`manager/nuget/artifacts supports docker mode 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/dotnet",
@@ -180,7 +180,7 @@ Array [
 ]
 `;
 
-exports[`updateArtifacts supports global mode 1`] = `
+exports[`manager/nuget/artifacts supports global mode 1`] = `
 Array [
   Object {
     "cmd": "dotnet restore project.csproj --force-evaluate --configfile others/nuget/not-so-random/nuget.config",
@@ -203,7 +203,7 @@ Array [
 ]
 `;
 
-exports[`updateArtifacts updates lock file 1`] = `
+exports[`manager/nuget/artifacts updates lock file 1`] = `
 Array [
   Object {
     "cmd": "dotnet restore project.csproj --force-evaluate --configfile others/nuget/not-so-random/nuget.config",
diff --git a/lib/manager/nuget/artifacts.spec.ts b/lib/manager/nuget/artifacts.spec.ts
index 8135db783ec10fd3af37c3e758af55085e735a9e..0a692be8755f5f446f14b247af87bff4172423bf 100644
--- a/lib/manager/nuget/artifacts.spec.ts
+++ b/lib/manager/nuget/artifacts.spec.ts
@@ -39,7 +39,7 @@ const adminConfig: RepoGlobalConfig = {
 
 const config: UpdateArtifactsConfig = {};
 
-describe('updateArtifacts', () => {
+describe('manager/nuget/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/nuget/extract.spec.ts b/lib/manager/nuget/extract.spec.ts
index 4869e8d28867a1faead6527fb180061bb2d44877..af9392d5050541922566f8db064be68b2c331166 100644
--- a/lib/manager/nuget/extract.spec.ts
+++ b/lib/manager/nuget/extract.spec.ts
@@ -1,5 +1,5 @@
 import * as upath from 'upath';
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import type { ExtractConfig } from '../types';
@@ -11,7 +11,7 @@ const adminConfig: RepoGlobalConfig = {
   localDir: upath.resolve('lib/manager/nuget/__fixtures__'),
 };
 
-describe(getName(), () => {
+describe('manager/nuget/extract', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       setGlobalConfig(adminConfig);
diff --git a/lib/manager/nvm/extract.spec.ts b/lib/manager/nvm/extract.spec.ts
index a4058e4787a481a51b9b1f03790c8d0679c08510..6cd92c8dbadea17cf7f3b86f1139871b045cb369 100644
--- a/lib/manager/nvm/extract.spec.ts
+++ b/lib/manager/nvm/extract.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-describe(getName(), () => {
+describe('manager/nvm/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns a result', () => {
       const res = extractPackageFile('8.4.0\n');
diff --git a/lib/manager/pip-compile/__snapshots__/artifacts.spec.ts.snap b/lib/manager/pip-compile/__snapshots__/artifacts.spec.ts.snap
index 7fa37078f87784a9da2add329656891eaec4f85c..ee186ca9e830c9477f16e40f958dc33ced60715e 100644
--- a/lib/manager/pip-compile/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/pip-compile/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() catches errors 1`] = `
+exports[`manager/pip-compile/artifacts catches errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -11,7 +11,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/pip-compile/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "pip-compile",
@@ -34,7 +34,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated requirements.txt 1`] = `
+exports[`manager/pip-compile/artifacts returns updated requirements.txt 1`] = `
 Array [
   Object {
     "cmd": "pip-compile",
@@ -57,7 +57,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated requirements.txt when doing lockfile maintenance 1`] = `
+exports[`manager/pip-compile/artifacts returns updated requirements.txt when doing lockfile maintenance 1`] = `
 Array [
   Object {
     "cmd": "pip-compile",
@@ -80,7 +80,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports docker mode 1`] = `
+exports[`manager/pip-compile/artifacts supports docker mode 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python",
@@ -115,7 +115,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() uses pipenv version from config 1`] = `
+exports[`manager/pip-compile/artifacts uses pipenv version from config 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python",
diff --git a/lib/manager/pip-compile/artifacts.spec.ts b/lib/manager/pip-compile/artifacts.spec.ts
index a89dd267f2c7aa5b046dc0532484816818d314cc..3c64357c336085edc41efbd726030b31906772bd 100644
--- a/lib/manager/pip-compile/artifacts.spec.ts
+++ b/lib/manager/pip-compile/artifacts.spec.ts
@@ -32,7 +32,7 @@ const dockerAdminConfig = { ...adminConfig, binarySource: 'docker' };
 const config: UpdateArtifactsConfig = {};
 const lockMaintenanceConfig = { ...config, isLockFileMaintenance: true };
 
-describe('.updateArtifacts()', () => {
+describe('manager/pip-compile/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     env.getChildProcessEnv.mockReturnValue({
diff --git a/lib/manager/pip_requirements/artifacts.spec.ts b/lib/manager/pip_requirements/artifacts.spec.ts
index 04a5b2ad5efd9d9d21bcf807f3889e6f7812a989..798025ef7a07100bd1a68429288e20dda253a9a9 100644
--- a/lib/manager/pip_requirements/artifacts.spec.ts
+++ b/lib/manager/pip_requirements/artifacts.spec.ts
@@ -15,7 +15,7 @@ const newPackageFileContent = `atomicwrites==1.4.0 \
 --hash=sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4 \
 --hash=sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6`;
 
-describe('.updateArtifacts()', () => {
+describe('manager/pip_requirements/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/pip_requirements/extract.spec.ts b/lib/manager/pip_requirements/extract.spec.ts
index 27f78289a983f282696c61fa52aa653dafb71624..db292c219149f4cc1be5e8b5b910d50a8b14b7ad 100644
--- a/lib/manager/pip_requirements/extract.spec.ts
+++ b/lib/manager/pip_requirements/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import { extractPackageFile } from './extract';
 
@@ -10,7 +10,7 @@ const requirements5 = loadFixture('requirements5.txt');
 const requirements6 = loadFixture('requirements6.txt');
 const requirements7 = loadFixture('requirements7.txt');
 
-describe(getName(), () => {
+describe('manager/pip_requirements/extract', () => {
   beforeEach(() => {
     delete process.env.PIP_TEST_TOKEN;
     setGlobalConfig();
diff --git a/lib/manager/pip_requirements/range.spec.ts b/lib/manager/pip_requirements/range.spec.ts
index 413bf2e7c3cfb77bd3a1cbf7eecae10807135e72..00d2861330cb46f2166c4a0cea2797d7bf2bcc5a 100644
--- a/lib/manager/pip_requirements/range.spec.ts
+++ b/lib/manager/pip_requirements/range.spec.ts
@@ -1,7 +1,7 @@
 import type { RangeConfig } from '../types';
 import { getRangeStrategy } from '.';
 
-describe('getRangeStrategy', () => {
+describe('manager/pip_requirements/range', () => {
   it('returns same if not auto', () => {
     const config: RangeConfig = { rangeStrategy: 'widen' };
     expect(getRangeStrategy(config)).toEqual('widen');
diff --git a/lib/manager/pip_setup/extract.spec.ts b/lib/manager/pip_setup/extract.spec.ts
index 70b7a8fbc6e6b10ca4c53d9a35113f363895a25f..9af134d966c0c74841a7c97ba4ba98e9a88b0903 100644
--- a/lib/manager/pip_setup/extract.spec.ts
+++ b/lib/manager/pip_setup/extract.spec.ts
@@ -1,5 +1,5 @@
 import { envMock, exec, mockExecSequence } from '../../../test/exec-util';
-import { env, getName } from '../../../test/util';
+import { env } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import {
   getPythonAlias,
@@ -11,7 +11,7 @@ import {
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
 
-describe(getName(), () => {
+describe('manager/pip_setup/extract', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/pip_setup/index.spec.ts b/lib/manager/pip_setup/index.spec.ts
index e34362a08ea536fa5772753361764f43d0aa86f4..de5380d6bb3ba37905c7e76786d0ed0512b0208c 100644
--- a/lib/manager/pip_setup/index.spec.ts
+++ b/lib/manager/pip_setup/index.spec.ts
@@ -5,7 +5,7 @@ import {
   mockExecAll,
   mockExecSequence,
 } from '../../../test/exec-util';
-import { env, getName, loadFixture } from '../../../test/util';
+import { env, loadFixture } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import * as fs from '../../util/fs';
@@ -39,7 +39,7 @@ const fixSnapshots = (snapshots: ExecSnapshots): ExecSnapshots =>
     cmd: snapshot.cmd.replace(/^.*extract\.py"\s+/, '<extract.py> '),
   }));
 
-describe(getName(), () => {
+describe('manager/pip_setup/index', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/pipenv/__snapshots__/artifacts.spec.ts.snap b/lib/manager/pipenv/__snapshots__/artifacts.spec.ts.snap
index 991f4da5db3184eda6ce780c6554573bce958c86..ba04fe5ad957c7a7ab49b920a985cb92666d1ef3 100644
--- a/lib/manager/pipenv/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/pipenv/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() catches errors 1`] = `
+exports[`manager/pipenv/artifacts catches errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -11,7 +11,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() handles no constraint 1`] = `
+exports[`manager/pipenv/artifacts handles no constraint 1`] = `
 Array [
   Object {
     "cmd": "pipenv lock",
@@ -35,7 +35,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/pipenv/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "pipenv lock",
@@ -59,7 +59,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Pipenv.lock when doing lockfile maintenance 1`] = `
+exports[`manager/pipenv/artifacts returns updated Pipenv.lock when doing lockfile maintenance 1`] = `
 Array [
   Object {
     "cmd": "pipenv lock",
@@ -83,7 +83,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated Pipfile.lock 1`] = `
+exports[`manager/pipenv/artifacts returns updated Pipfile.lock 1`] = `
 Array [
   Object {
     "cmd": "pipenv lock",
@@ -107,7 +107,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() supports docker mode 1`] = `
+exports[`manager/pipenv/artifacts supports docker mode 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python:latest",
@@ -143,7 +143,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() uses pipenv version from Pipfile 1`] = `
+exports[`manager/pipenv/artifacts uses pipenv version from Pipfile 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python",
@@ -179,7 +179,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() uses pipenv version from Pipfile dev packages 1`] = `
+exports[`manager/pipenv/artifacts uses pipenv version from Pipfile dev packages 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python",
@@ -215,7 +215,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() uses pipenv version from config 1`] = `
+exports[`manager/pipenv/artifacts uses pipenv version from config 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python",
diff --git a/lib/manager/pipenv/artifacts.spec.ts b/lib/manager/pipenv/artifacts.spec.ts
index 6c4e0a5172934dfcd6863692e11f93208bf239f6..c4733af3b8c744c8d968777d5a16e12eb3a2a1ec 100644
--- a/lib/manager/pipenv/artifacts.spec.ts
+++ b/lib/manager/pipenv/artifacts.spec.ts
@@ -32,7 +32,7 @@ const dockerAdminConfig = { ...adminConfig, binarySource: 'docker' };
 const config: UpdateArtifactsConfig = {};
 const lockMaintenanceConfig = { ...config, isLockFileMaintenance: true };
 
-describe('.updateArtifacts()', () => {
+describe('manager/pipenv/artifacts', () => {
   let pipFileLock;
   beforeEach(() => {
     jest.resetAllMocks();
diff --git a/lib/manager/pipenv/extract.spec.ts b/lib/manager/pipenv/extract.spec.ts
index e6077430df126cc0b88fd70b655cac3182a9ffb2..88804599b428df090e71b17ff7a4147ff90abcd0 100644
--- a/lib/manager/pipenv/extract.spec.ts
+++ b/lib/manager/pipenv/extract.spec.ts
@@ -1,4 +1,4 @@
-import { fs as fsutil, getName, loadFixture } from '../../../test/util';
+import { fs as fsutil, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
@@ -9,7 +9,7 @@ const pipfile3 = loadFixture('Pipfile3');
 const pipfile4 = loadFixture('Pipfile4');
 const pipfile5 = loadFixture('Pipfile5');
 
-describe(getName(), () => {
+describe('manager/pipenv/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', async () => {
       expect(await extractPackageFile('[packages]\r\n', 'Pipfile')).toBeNull();
diff --git a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
index 0ac8920c45d12d560b76e6be7269aa1722c07587..daeea84f5851d7ef20d5477285879d357c07a5ad 100644
--- a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`.updateArtifacts() catches errors 1`] = `
+exports[`manager/poetry/artifacts catches errors 1`] = `
 Array [
   Object {
     "artifactError": Object {
@@ -12,7 +12,7 @@ undefined",
 ]
 `;
 
-exports[`.updateArtifacts() passes private credential environment vars 1`] = `
+exports[`manager/poetry/artifacts passes private credential environment vars 1`] = `
 Array [
   Object {
     "cmd": "poetry update --lock --no-interaction dep1",
@@ -39,7 +39,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns null if unchanged 1`] = `
+exports[`manager/poetry/artifacts returns null if unchanged 1`] = `
 Array [
   Object {
     "cmd": "poetry update --lock --no-interaction dep1",
@@ -62,7 +62,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated poetry.lock 1`] = `
+exports[`manager/poetry/artifacts returns updated poetry.lock 1`] = `
 Array [
   Object {
     "cmd": "poetry update --lock --no-interaction dep1",
@@ -85,7 +85,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated poetry.lock using docker (constraints) 1`] = `
+exports[`manager/poetry/artifacts returns updated poetry.lock using docker (constraints) 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python:2.7.5",
@@ -120,7 +120,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated poetry.lock using docker 1`] = `
+exports[`manager/poetry/artifacts returns updated poetry.lock using docker 1`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/python:3.4.2",
@@ -155,7 +155,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated poetry.lock when doing lockfile maintenance 1`] = `
+exports[`manager/poetry/artifacts returns updated poetry.lock when doing lockfile maintenance 1`] = `
 Array [
   Object {
     "cmd": "poetry update --lock --no-interaction",
@@ -178,7 +178,7 @@ Array [
 ]
 `;
 
-exports[`.updateArtifacts() returns updated pyproject.lock 1`] = `
+exports[`manager/poetry/artifacts returns updated pyproject.lock 1`] = `
 Array [
   Object {
     "cmd": "poetry update --lock --no-interaction dep1",
diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts
index 23faef026f919fefc410c2338cef4e91f032e437..357878b605be62bd3e4da4041c26d81c2cc0dd9f 100644
--- a/lib/manager/poetry/artifacts.spec.ts
+++ b/lib/manager/poetry/artifacts.spec.ts
@@ -32,7 +32,7 @@ const adminConfig: RepoGlobalConfig = {
 
 const config: UpdateArtifactsConfig = {};
 
-describe('.updateArtifacts()', () => {
+describe('manager/poetry/artifacts', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     env.getChildProcessEnv.mockReturnValue(envMock.basic);
diff --git a/lib/manager/poetry/extract.spec.ts b/lib/manager/poetry/extract.spec.ts
index 6cb8ebf9d25da3bfc1264a67bf9aee86a6c3efbb..cf88773a4c931bc1cd69901abd1558ddd5d0d1a5 100644
--- a/lib/manager/poetry/extract.spec.ts
+++ b/lib/manager/poetry/extract.spec.ts
@@ -1,4 +1,4 @@
-import { fs, getName, loadFixture } from '../../../test/util';
+import { fs, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
@@ -17,7 +17,7 @@ const pyproject9toml = loadFixture('pyproject.9.toml');
 const pyproject11toml = loadFixture('pyproject.11.toml');
 const pyproject11tomlLock = loadFixture('pyproject.11.toml.lock');
 
-describe(getName(), () => {
+describe('manager/poetry/extract', () => {
   describe('extractPackageFile()', () => {
     let filename: string;
     const OLD_ENV = process.env;
diff --git a/lib/manager/pre-commit/extract.spec.ts b/lib/manager/pre-commit/extract.spec.ts
index a5fde2101bb0672904a2686fb3532fcfb99bb5cf..78dd6eb41c9cebb9fb4986bae98fd19c84d86db9 100644
--- a/lib/manager/pre-commit/extract.spec.ts
+++ b/lib/manager/pre-commit/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture, mocked } from '../../../test/util';
+import { loadFixture, mocked } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import { extractPackageFile } from './extract';
 
@@ -19,7 +19,7 @@ const enterpriseGitPrecommitConfig = loadFixture(
   'enterprise.pre-commit-config.yaml'
 );
 
-describe(getName(), () => {
+describe('manager/pre-commit/extract', () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
       jest.resetAllMocks();
diff --git a/lib/manager/pub/extract.spec.ts b/lib/manager/pub/extract.spec.ts
index 637726b897bff08d5bf325a87252adc5f1731896..7af68440e3fb83fa19382ea09da971484af303bf 100644
--- a/lib/manager/pub/extract.spec.ts
+++ b/lib/manager/pub/extract.spec.ts
@@ -1,10 +1,10 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
 const brokenYaml = loadFixture('update.yaml');
 const packageFile = loadFixture('extract.yaml');
 
-describe(getName(), () => {
+describe('manager/pub/extract', () => {
   describe('extractPackageFile', () => {
     it('should return null if package does not contain any deps', () => {
       const res = extractPackageFile('foo: bar', 'pubspec.yaml');
diff --git a/lib/manager/pyenv/extract.spec.ts b/lib/manager/pyenv/extract.spec.ts
index ae9e37cc25eedc2a0083d17c5b2dd8f05dba5661..1131abc0ece3b898c6564c504dfc26923ce216b4 100644
--- a/lib/manager/pyenv/extract.spec.ts
+++ b/lib/manager/pyenv/extract.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-describe(getName(), () => {
+describe('manager/pyenv/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns a result', () => {
       const res = extractPackageFile('3.7.1\n');
diff --git a/lib/manager/range.spec.ts b/lib/manager/range.spec.ts
index 8e0ac406a1695b9861cbf5f7fd42912525b0d4e7..4726cc910e5999254615afce51c46ccc32fa5f4c 100644
--- a/lib/manager/range.spec.ts
+++ b/lib/manager/range.spec.ts
@@ -1,7 +1,7 @@
 import type { RangeConfig } from './types';
 import { getRangeStrategy } from '.';
 
-describe('getRangeStrategy', () => {
+describe('manager/range', () => {
   it('returns same if not auto', () => {
     const config: RangeConfig = {
       manager: 'npm',
diff --git a/lib/manager/regex/index.spec.ts b/lib/manager/regex/index.spec.ts
index cf64e8c36fb4c007f2f305fa8bef422727fa1698..cdd1f6c0605997e719dab103cdd4d2a6e5510db1 100644
--- a/lib/manager/regex/index.spec.ts
+++ b/lib/manager/regex/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { logger } from '../../logger';
 import type { CustomExtractConfig } from '../types';
 import { defaultConfig, extractPackageFile } from '.';
@@ -8,7 +8,7 @@ const ansibleYamlContent = loadFixture(`ansible.yml`);
 const exampleJsonContent = loadFixture(`example.json`);
 const exampleGitlabCiYml = loadFixture(`gitlab-ci.yml`);
 
-describe(getName(), () => {
+describe('manager/regex/index', () => {
   it('has default config', () => {
     expect(defaultConfig).toEqual({
       pinDigests: false,
diff --git a/lib/manager/ruby-version/extract.spec.ts b/lib/manager/ruby-version/extract.spec.ts
index a4058e4787a481a51b9b1f03790c8d0679c08510..dbec0235de46109487f6eea4ea00c3739cde5329 100644
--- a/lib/manager/ruby-version/extract.spec.ts
+++ b/lib/manager/ruby-version/extract.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-describe(getName(), () => {
+describe('manager/ruby-version/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns a result', () => {
       const res = extractPackageFile('8.4.0\n');
diff --git a/lib/manager/sbt/extract.spec.ts b/lib/manager/sbt/extract.spec.ts
index 06b609ae4206a1dbab64966e842da56a6e43b46d..0c5d436bad9ea4b05188a4d4512e7dd3ab039ddf 100644
--- a/lib/manager/sbt/extract.spec.ts
+++ b/lib/manager/sbt/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const sbt = loadFixture(`sample.sbt`);
@@ -9,7 +9,7 @@ const sbtPrivateVariableDependencyFile = loadFixture(
   `private-variable-dependency-file.scala`
 );
 
-describe(getName(), () => {
+describe('manager/sbt/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile(null)).toBeNull();
diff --git a/lib/manager/sbt/update.spec.ts b/lib/manager/sbt/update.spec.ts
index dcf0490fffebfac09cfe224016c1e064bf4dffb5..c23e93fbfc4d45326f8a2f9ae8de418ba47040c9 100644
--- a/lib/manager/sbt/update.spec.ts
+++ b/lib/manager/sbt/update.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import * as sbtUpdater from './update';
 
-describe(getName(), () => {
+describe('manager/sbt/update', () => {
   describe('.bumpPackageVersion()', () => {
     const content =
       'name := "test"\n' +
diff --git a/lib/manager/setup-cfg/extract.spec.ts b/lib/manager/setup-cfg/extract.spec.ts
index c00d930022d8fa2aa3654a0c707de6a6f701e00b..d7978e6a20fb81117d38ab1f83be631e27996d53 100644
--- a/lib/manager/setup-cfg/extract.spec.ts
+++ b/lib/manager/setup-cfg/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const content = loadFixture('setup-cfg-1.txt');
 
-describe(getName(), () => {
+describe('manager/setup-cfg/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/setup-cfg/range.spec.ts b/lib/manager/setup-cfg/range.spec.ts
index 2745c51e3f039c9ee2df23a7af1fa1b62a4c202c..5f6cc8796412cfd24526ef8a4c708aa66dd614d2 100644
--- a/lib/manager/setup-cfg/range.spec.ts
+++ b/lib/manager/setup-cfg/range.spec.ts
@@ -1,7 +1,7 @@
 import type { RangeConfig } from '../types';
 import { getRangeStrategy } from '.';
 
-describe('getRangeStrategy', () => {
+describe('manager/setup-cfg/range', () => {
   it('returns same if not auto', () => {
     const config: RangeConfig = { rangeStrategy: 'widen' };
     expect(getRangeStrategy(config)).toEqual('widen');
diff --git a/lib/manager/swift/index.spec.ts b/lib/manager/swift/index.spec.ts
index 98e72a62e89a3c4d6203d64aaa464ac1ec6e5fb5..c5dba98d7f9ed28cb7206ce9b888e1a35fe04ce9 100644
--- a/lib/manager/swift/index.spec.ts
+++ b/lib/manager/swift/index.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const pkgContent = loadFixture(`SamplePackage.swift`);
 
-describe(getName(), () => {
+describe('manager/swift/index', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty content', () => {
       expect(extractPackageFile(null)).toBeNull();
diff --git a/lib/manager/terraform-version/extract.spec.ts b/lib/manager/terraform-version/extract.spec.ts
index 00bf01f61dc63459376a602a6d651a4da322ac80..7bc0d51f2cfe5f4afbc63ab0e29da04591b9a609 100644
--- a/lib/manager/terraform-version/extract.spec.ts
+++ b/lib/manager/terraform-version/extract.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-describe(getName(), () => {
+describe('manager/terraform-version/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns a result', () => {
       const res = extractPackageFile('12.0.0\n');
diff --git a/lib/manager/terraform/extract.spec.ts b/lib/manager/terraform/extract.spec.ts
index a8b06a6ee5db4116c08b6339d0c2d0218a0c8884..90f9abc5bd8c7d24df5b9381a108d5834e007d35 100644
--- a/lib/manager/terraform/extract.spec.ts
+++ b/lib/manager/terraform/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const tf1 = loadFixture('1.tf');
@@ -8,7 +8,7 @@ const tf2 = `module "relative" {
 `;
 const helm = loadFixture('helm.tf');
 
-describe(getName(), () => {
+describe('manager/terraform/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/terraform/lockfile/hash.spec.ts b/lib/manager/terraform/lockfile/hash.spec.ts
index 14228e2d543dd9e527d350bfcd0fe6914ed7245e..d14da9c54cfb9f5c18c5cccef903ad71f74c722b 100644
--- a/lib/manager/terraform/lockfile/hash.spec.ts
+++ b/lib/manager/terraform/lockfile/hash.spec.ts
@@ -1,12 +1,7 @@
 import { createReadStream } from 'fs';
 import { DirectoryResult, dir } from 'tmp-promise';
 import * as httpMock from '../../../../test/http-mock';
-import {
-  getFixturePath,
-  getName,
-  loadFixture,
-  logger,
-} from '../../../../test/util';
+import { getFixturePath, loadFixture, logger } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import { TerraformProviderDatasource } from '../../../datasource/terraform-provider';
 import { Logger } from '../../../logger/types';
@@ -17,7 +12,7 @@ const releaseBackendAzurerm = loadFixture('releaseBackendAzurerm_2_56_0.json');
 
 const log = logger.logger as jest.Mocked<Logger>;
 
-describe(getName(), () => {
+describe('manager/terraform/lockfile/hash', () => {
   let cacheDir: DirectoryResult;
 
   beforeEach(async () => {
diff --git a/lib/manager/terraform/lockfile/index.spec.ts b/lib/manager/terraform/lockfile/index.spec.ts
index 2b496169f60973b550c5d32efddc3292fb78e6f5..091fe80984a7f2f3261903749a9f48a70d02f5a6 100644
--- a/lib/manager/terraform/lockfile/index.spec.ts
+++ b/lib/manager/terraform/lockfile/index.spec.ts
@@ -1,5 +1,5 @@
 import { join } from 'upath';
-import { fs, getName, loadFixture, mocked } from '../../../../test/util';
+import { fs, loadFixture, mocked } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import { getPkgReleases } from '../../../datasource';
 import type { UpdateArtifactsConfig } from '../../types';
@@ -28,7 +28,7 @@ const mockGetPkgReleases = getPkgReleases as jest.MockedFunction<
   typeof getPkgReleases
 >;
 
-describe(getName(), () => {
+describe('manager/terraform/lockfile/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     jest.resetModules();
diff --git a/lib/manager/terraform/lockfile/util.spec.ts b/lib/manager/terraform/lockfile/util.spec.ts
index 77e60d7f19d8bb627f6c9f7b7a9f2f0b12afba23..9a86e2255a49aeca42570c4b49520728780e3845 100644
--- a/lib/manager/terraform/lockfile/util.spec.ts
+++ b/lib/manager/terraform/lockfile/util.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../../test/util';
+import { loadFixture } from '../../../../test/util';
 import { extractLocks } from './util';
 
 const validLockfile = loadFixture('validLockfile.hcl');
 
-describe(getName(), () => {
+describe('manager/terraform/lockfile/util', () => {
   describe('extractLocks()', () => {
     it('returns null for empty', () => {
       const result = extractLocks('nothing here');
diff --git a/lib/manager/terraform/modules.spec.ts b/lib/manager/terraform/modules.spec.ts
index fe85fdaedda699c16ee6cb4248d5a2505b354643..f7c1674e5a655ba8879cbd3b50e41bd305499c01 100644
--- a/lib/manager/terraform/modules.spec.ts
+++ b/lib/manager/terraform/modules.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { gitTagsRefMatchRegex, githubRefMatchRegex } from './modules';
 
-describe(getName(), () => {
+describe('manager/terraform/modules', () => {
   describe('githubRefMatchRegex', () => {
     it('should split project and tag from source', () => {
       const { project, tag } = githubRefMatchRegex.exec(
diff --git a/lib/manager/terraform/util.spec.ts b/lib/manager/terraform/util.spec.ts
index 367cb4ad1a6164cba560a7e5420935032924b87b..3de5ec172ef59163193fc2d5249f1aaab71bc8eb 100644
--- a/lib/manager/terraform/util.spec.ts
+++ b/lib/manager/terraform/util.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../test/util';
 import { TerraformDependencyTypes } from './common';
 import { getTerraformDependencyType } from './util';
 
-describe(getName(), () => {
+describe('manager/terraform/util', () => {
   describe('getTerraformDependencyType()', () => {
     it('returns TerraformDependencyTypes.module', () => {
       expect(getTerraformDependencyType('module')).toBe(
diff --git a/lib/manager/terragrunt-version/extract.spec.ts b/lib/manager/terragrunt-version/extract.spec.ts
index 8530ef3b0b4039c12a01c1395c4f247cf5a942f2..ee1e62e8ace65c8006ec66ea7324b4c30cb79a75 100644
--- a/lib/manager/terragrunt-version/extract.spec.ts
+++ b/lib/manager/terragrunt-version/extract.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-describe(getName(), () => {
+describe('manager/terragrunt-version/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns a result', () => {
       const res = extractPackageFile('12.0.0\n');
diff --git a/lib/manager/terragrunt/extract.spec.ts b/lib/manager/terragrunt/extract.spec.ts
index e12406d66f400845906558fc990b21b3ba8a0c7a..a903c2770f814182bbd9ce3ee36bebf10adb2b7c 100644
--- a/lib/manager/terragrunt/extract.spec.ts
+++ b/lib/manager/terragrunt/extract.spec.ts
@@ -1,4 +1,4 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const tg1 = loadFixture('2.hcl');
@@ -7,7 +7,7 @@ const tg2 = `terragrunt {
 }
 `;
 
-describe(getName(), () => {
+describe('manager/terragrunt/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns null for empty', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
diff --git a/lib/manager/terragrunt/modules.spec.ts b/lib/manager/terragrunt/modules.spec.ts
index fe85fdaedda699c16ee6cb4248d5a2505b354643..283d1b150d9d1d8e521c941717906c8a461fa7e9 100644
--- a/lib/manager/terragrunt/modules.spec.ts
+++ b/lib/manager/terragrunt/modules.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { gitTagsRefMatchRegex, githubRefMatchRegex } from './modules';
 
-describe(getName(), () => {
+describe('manager/terragrunt/modules', () => {
   describe('githubRefMatchRegex', () => {
     it('should split project and tag from source', () => {
       const { project, tag } = githubRefMatchRegex.exec(
diff --git a/lib/manager/terragrunt/util.spec.ts b/lib/manager/terragrunt/util.spec.ts
index 26e12fe03d6ce933d4b43dc8090ee365500fb6ed..e911532f4ed9f7f975bd28e3279758d6492c173a 100644
--- a/lib/manager/terragrunt/util.spec.ts
+++ b/lib/manager/terragrunt/util.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../test/util';
 import { TerragruntDependencyTypes } from './common';
 import { getTerragruntDependencyType } from './util';
 
-describe(getName(), () => {
+describe('manager/terragrunt/util', () => {
   describe('getTerragruntDependencyType()', () => {
     it('returns TerragruntDependencyTypes.terragrunt', () => {
       expect(getTerragruntDependencyType('terraform')).toBe(
diff --git a/lib/manager/travis/extract.spec.ts b/lib/manager/travis/extract.spec.ts
index 0bc26798ddc54dd8878e11ca48524d47a3dc1603..abeb3a98e46a473838da30f15c4673ee47f28da9 100644
--- a/lib/manager/travis/extract.spec.ts
+++ b/lib/manager/travis/extract.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 const invalidYAML = loadFixture('invalid.yml');
 
-describe(getName(), () => {
+describe('manager/travis/extract', () => {
   describe('extractPackageFile()', () => {
     it('returns empty if fails to parse', () => {
       const res = extractPackageFile('blahhhhh:foo:@what\n');
diff --git a/lib/platform/azure/azure-got-wrapper.spec.ts b/lib/platform/azure/azure-got-wrapper.spec.ts
index 1c8800bb809493ffbde9fcc0e9e72d5c719aff5c..6ac00d978aefca5eea154b7a36a2a9cec0ec9a19 100644
--- a/lib/platform/azure/azure-got-wrapper.spec.ts
+++ b/lib/platform/azure/azure-got-wrapper.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../test/util';
 import { PLATFORM_TYPE_AZURE } from '../../constants/platforms';
 import * as _hostRules from '../../util/host-rules';
 
-describe(getName(), () => {
+describe('platform/azure/azure-got-wrapper', () => {
   let azure: typeof import('./azure-got-wrapper');
   let hostRules: typeof _hostRules;
   beforeEach(() => {
diff --git a/lib/platform/azure/azure-helper.spec.ts b/lib/platform/azure/azure-helper.spec.ts
index 3fd0d9ab0c661279d1565edd7f37d087a9ad783b..1476ccfa8fc76243e808de1ef637b46f34a6cd1c 100644
--- a/lib/platform/azure/azure-helper.spec.ts
+++ b/lib/platform/azure/azure-helper.spec.ts
@@ -1,8 +1,7 @@
 import { Readable } from 'stream';
 import { GitPullRequestMergeStrategy } from 'azure-devops-node-api/interfaces/GitInterfaces';
-import { getName } from '../../../test/util';
 
-describe(getName(), () => {
+describe('platform/azure/azure-helper', () => {
   let azureHelper: typeof import('./azure-helper');
   let azureApi: jest.Mocked<typeof import('./azure-got-wrapper')>;
 
diff --git a/lib/platform/azure/index.spec.ts b/lib/platform/azure/index.spec.ts
index 76ba7745d9c2f9788ee20bee6a6fac8fb351016d..90e2361480b25698008a1ad1bc89f8cc80501b86 100644
--- a/lib/platform/azure/index.spec.ts
+++ b/lib/platform/azure/index.spec.ts
@@ -5,7 +5,6 @@ import {
   GitStatusState,
   PullRequestStatus,
 } from 'azure-devops-node-api/interfaces/GitInterfaces';
-import { getName } from '../../../test/util';
 import { logger as _logger } from '../../logger';
 import { BranchStatus, PrState } from '../../types';
 import * as _git from '../../util/git';
@@ -13,7 +12,7 @@ import * as _hostRules from '../../util/host-rules';
 import type { Platform, RepoParams } from '../types';
 import { AzurePrVote } from './types';
 
-describe(getName(), () => {
+describe('platform/azure/index', () => {
   let hostRules: jest.Mocked<typeof _hostRules>;
   let azure: Platform;
   let azureApi: jest.Mocked<typeof import('./azure-got-wrapper')>;
diff --git a/lib/platform/azure/util.spec.ts b/lib/platform/azure/util.spec.ts
index f6b6edec8197364e64b8cf05f14bd04168273e42..bb967ee5d91f554cd2bd9833c681e014e5dc69cc 100644
--- a/lib/platform/azure/util.spec.ts
+++ b/lib/platform/azure/util.spec.ts
@@ -1,5 +1,4 @@
 import { Readable } from 'stream';
-import { getName } from '../../../test/util';
 import {
   getBranchNameWithoutRefsheadsPrefix,
   getGitStatusContextCombinedName,
@@ -13,7 +12,7 @@ import {
   streamToString,
 } from './util';
 
-describe(getName(), () => {
+describe('platform/azure/util', () => {
   describe('getNewBranchName', () => {
     it('should add refs/heads', () => {
       const res = getNewBranchName('testBB');
diff --git a/lib/platform/bitbucket-server/index.spec.ts b/lib/platform/bitbucket-server/index.spec.ts
index 2d39843c40ed034cdf874f9f6f49be1d9e4d71c0..1002b9aafa27195fd908a305b4a4908f9d334749 100644
--- a/lib/platform/bitbucket-server/index.spec.ts
+++ b/lib/platform/bitbucket-server/index.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import {
   REPOSITORY_CHANGED,
   REPOSITORY_EMPTY,
@@ -168,7 +167,7 @@ const scenarios = {
   'endpoint with path': new URL('https://stash.renovatebot.com/vcs'),
 };
 
-describe(getName(), () => {
+describe('platform/bitbucket-server/index', () => {
   Object.entries(scenarios).forEach(([scenarioName, url]) => {
     const urlHost = url.origin;
     const urlPath = url.pathname === '/' ? '' : url.pathname;
diff --git a/lib/platform/bitbucket/__snapshots__/utils.spec.ts.snap b/lib/platform/bitbucket/__snapshots__/utils.spec.ts.snap
index e26ef15d9c6c54db28d55af1c542aaf3360ebc0b..9e35a709e42544a4ade423f5a14ec5336cd54421 100644
--- a/lib/platform/bitbucket/__snapshots__/utils.spec.ts.snap
+++ b/lib/platform/bitbucket/__snapshots__/utils.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`accumulateValues() paginates 1`] = `
+exports[`platform/bitbucket/utils paginates 1`] = `
 Array [
   Object {
     "headers": Object {
diff --git a/lib/platform/bitbucket/comments.spec.ts b/lib/platform/bitbucket/comments.spec.ts
index aebc255bb7f5022151a109ce5fd657ee7010b323..8b2b5f60c38465e25b8d722afb42a9d9118169c7 100644
--- a/lib/platform/bitbucket/comments.spec.ts
+++ b/lib/platform/bitbucket/comments.spec.ts
@@ -1,11 +1,10 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { setBaseUrl } from '../../util/http/bitbucket';
 import * as comments from './comments';
 
 const baseUrl = 'https://api.bitbucket.org';
 
-describe(getName(), () => {
+describe('platform/bitbucket/comments', () => {
   const config: comments.CommentsConfig = { repository: 'some/repo' };
 
   beforeEach(() => {
diff --git a/lib/platform/bitbucket/index.spec.ts b/lib/platform/bitbucket/index.spec.ts
index 993a936f9f076371ff2cad0c15138638e1c94f84..2711cf3cc7a9988321fb7f246a7d7ae938b11c21 100644
--- a/lib/platform/bitbucket/index.spec.ts
+++ b/lib/platform/bitbucket/index.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { logger as _logger } from '../../logger';
 import { BranchStatus, PrState } from '../../types';
 import * as _git from '../../util/git';
@@ -34,7 +33,7 @@ lxml==3.6.0
 mccabe==0.6.1
 `;
 
-describe(getName(), () => {
+describe('platform/bitbucket/index', () => {
   let bitbucket: Platform;
   let hostRules: jest.Mocked<typeof import('../../util/host-rules')>;
   let git: jest.Mocked<typeof _git>;
diff --git a/lib/platform/bitbucket/utils.spec.ts b/lib/platform/bitbucket/utils.spec.ts
index 39da0c4061a018bf050de3cdd585a565fdbeb34b..a110fcc34ec759b1e2794a458a187715f9540ddc 100644
--- a/lib/platform/bitbucket/utils.spec.ts
+++ b/lib/platform/bitbucket/utils.spec.ts
@@ -6,7 +6,7 @@ const range = (count: number) => [...Array(count).keys()];
 
 const baseUrl = 'https://api.bitbucket.org';
 
-describe('accumulateValues()', () => {
+describe('platform/bitbucket/utils', () => {
   beforeEach(() => {
     setBaseUrl(baseUrl);
   });
diff --git a/lib/platform/gitea/gitea-helper.spec.ts b/lib/platform/gitea/gitea-helper.spec.ts
index 4d1ea8a3e905101ffb887d36755c5e3ea988095e..9011dd0a6d561a7a5e596566e2dbde5ba2178daf 100644
--- a/lib/platform/gitea/gitea-helper.spec.ts
+++ b/lib/platform/gitea/gitea-helper.spec.ts
@@ -1,10 +1,9 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { PrState } from '../../types';
 import { setBaseUrl } from '../../util/http/gitea';
 import * as ght from './gitea-helper';
 
-describe(getName(), () => {
+describe('platform/gitea/gitea-helper', () => {
   const baseUrl = 'https://gitea.renovatebot.com/api/v1';
 
   const mockCommitHash = '0d9c7726c3d628b7e28af234595cfd20febdbf8e';
diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts
index 058aed3ef89b9999e701a59faf8497de583c9221..2c41ac96a9cd02f9485ec376c406e2ecccefe7a8 100644
--- a/lib/platform/gitea/index.spec.ts
+++ b/lib/platform/gitea/index.spec.ts
@@ -5,7 +5,7 @@ import {
   RepoParams,
   RepoResult,
 } from '..';
-import { getName, partial } from '../../../test/util';
+import { partial } from '../../../test/util';
 import {
   REPOSITORY_ACCESS_FORBIDDEN,
   REPOSITORY_ARCHIVED,
@@ -26,7 +26,7 @@ import * as ght from './gitea-helper';
  */
 const GITEA_VERSION = '1.14.0+dev-754-g5d2b7ba63';
 
-describe(getName(), () => {
+describe('platform/gitea/index', () => {
   let gitea: Platform;
   let helper: jest.Mocked<typeof import('./gitea-helper')>;
   let logger: jest.Mocked<typeof _logger>;
diff --git a/lib/platform/github/index.spec.ts b/lib/platform/github/index.spec.ts
index ab4fdc442e3903a106f43283cddf2e14f273a681..99a5463b1a61b66458a6922de71ca0e2217afb24 100644
--- a/lib/platform/github/index.spec.ts
+++ b/lib/platform/github/index.spec.ts
@@ -1,6 +1,6 @@
 import { DateTime } from 'luxon';
 import * as httpMock from '../../../test/http-mock';
-import { getName, loadFixture, mocked } from '../../../test/util';
+import { loadFixture, mocked } from '../../../test/util';
 import {
   REPOSITORY_NOT_FOUND,
   REPOSITORY_RENAMED,
@@ -11,7 +11,7 @@ import type { Platform } from '../types';
 
 const githubApiHost = 'https://api.github.com';
 
-describe(getName(), () => {
+describe('platform/github/index', () => {
   let github: Platform;
   let hostRules: jest.Mocked<typeof import('../../util/host-rules')>;
   let git: jest.Mocked<typeof _git>;
diff --git a/lib/platform/github/massage-markdown-links.spec.ts b/lib/platform/github/massage-markdown-links.spec.ts
index 536ea879d0300dd7e3d638f41697eafe9f8c1e7f..0fd3b5023c8ac8ef2b80cef1e2dabfd4c412601d 100644
--- a/lib/platform/github/massage-markdown-links.spec.ts
+++ b/lib/platform/github/massage-markdown-links.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { massageMarkdownLinks } from './massage-markdown-links';
 
-describe(getName(), () => {
+describe('platform/github/massage-markdown-links', () => {
   it('performs multiple replacements', () => {
     const input = [
       'Link [foo/bar#1](https://github.com/foo/bar/pull/1) points to https://github.com/foo/bar/pull/1.',
diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts
index 4cbe3169ceb201e035103a5def5ba3ab6000e27a..66fc051eca391a96c067ee740e613e140b332297 100644
--- a/lib/platform/gitlab/index.spec.ts
+++ b/lib/platform/gitlab/index.spec.ts
@@ -1,7 +1,6 @@
 // TODO fix mocks
 import { Platform, RepoParams } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import {
   REPOSITORY_ARCHIVED,
   REPOSITORY_CHANGED,
@@ -16,7 +15,7 @@ import * as _hostRules from '../../util/host-rules';
 
 const gitlabApiHost = 'https://gitlab.com';
 
-describe(getName(), () => {
+describe('platform/gitlab/index', () => {
   let gitlab: Platform;
   let hostRules: jest.Mocked<typeof _hostRules>;
   let git: jest.Mocked<typeof _git>;
diff --git a/lib/platform/index.spec.ts b/lib/platform/index.spec.ts
index bcd5ff9c744479b35cfce8a08b29471a3764e1cc..54fd78d40abe1b0958b85062960af0113e8ea9e9 100644
--- a/lib/platform/index.spec.ts
+++ b/lib/platform/index.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../test/http-mock';
-import { getName } from '../../test/util';
 import { PLATFORM_NOT_FOUND } from '../constants/error-messages';
 import { PLATFORM_TYPE_BITBUCKET } from '../constants/platforms';
 import { loadModules } from '../util/modules';
@@ -8,7 +7,7 @@ import * as platform from '.';
 
 jest.unmock('.');
 
-describe(getName(), () => {
+describe('platform/index', () => {
   beforeEach(() => {
     jest.resetModules();
   });
diff --git a/lib/platform/utils/pr-body.spec.ts b/lib/platform/utils/pr-body.spec.ts
index 53335f47579fd3592999901ff41b57d2638e6407..710a4ceda601dda311a9804243b7ec629d5d14c2 100644
--- a/lib/platform/utils/pr-body.spec.ts
+++ b/lib/platform/utils/pr-body.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { smartTruncate } from './pr-body';
 
 const prBody = loadFixture('pr-body.txt');
 
-describe(getName(), () => {
+describe('platform/utils/pr-body', () => {
   describe('.smartTruncate', () => {
     it('truncates to 1000', () => {
       const body = smartTruncate(prBody, 1000);
diff --git a/lib/platform/utils/read-only-issue-body.spec.ts b/lib/platform/utils/read-only-issue-body.spec.ts
index 48e6b4ac37dc048a05a7473e6f925c435b3b8628..84d74569388b8f40821ca2f31b75e97480512989 100644
--- a/lib/platform/utils/read-only-issue-body.spec.ts
+++ b/lib/platform/utils/read-only-issue-body.spec.ts
@@ -1,9 +1,9 @@
-import { getName, loadFixture } from '../../../test/util';
+import { loadFixture } from '../../../test/util';
 import { readOnlyIssueBody } from './read-only-issue-body';
 
 const issueBody = loadFixture('issue-body.txt');
 
-describe(getName(), () => {
+describe('platform/utils/read-only-issue-body', () => {
   describe('.readOnlyIssueBody', () => {
     it('removes all checkbox formatting', () => {
       expect(readOnlyIssueBody(issueBody)).toEqual(
diff --git a/lib/util/__snapshots__/package-rules.spec.ts.snap b/lib/util/__snapshots__/package-rules.spec.ts.snap
index a4b5d021641dbe608f5e81747acdcc8779cf17f3..3220cf2227bdc21fc964ebfdc78ae3beefa7cc56 100644
--- a/lib/util/__snapshots__/package-rules.spec.ts.snap
+++ b/lib/util/__snapshots__/package-rules.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`applyPackageRules() applies 1`] = `
+exports[`util/package-rules applies 1`] = `
 Object {
   "currentValue": "1.0.0",
   "depName": "a",
@@ -49,7 +49,7 @@ Object {
 }
 `;
 
-exports[`applyPackageRules() empty rules 1`] = `
+exports[`util/package-rules empty rules 1`] = `
 Object {
   "foo": "bar",
   "packageRules": null,
diff --git a/lib/util/cache/memory/index.spec.ts b/lib/util/cache/memory/index.spec.ts
index 9272efecddabc8d5bf7e00bf07f62117cff0ece0..6d4fcdb2fdbdcf95d494fc4ba15b8a97184d5d9a 100644
--- a/lib/util/cache/memory/index.spec.ts
+++ b/lib/util/cache/memory/index.spec.ts
@@ -1,6 +1,6 @@
 import * as memCache from '.';
 
-describe('getRepoCache', () => {
+describe('util/cache/memory/index', () => {
   it('returns undefined if not init', () => {
     expect(memCache.get('key1')).toBeUndefined();
   });
diff --git a/lib/util/cache/package/decorator.spec.ts b/lib/util/cache/package/decorator.spec.ts
index dfc6b1bb6f7bd1ac96a734c16ac5a7bdfd5ea54c..5921bc34651c6171e2447da032543e53f565217d 100644
--- a/lib/util/cache/package/decorator.spec.ts
+++ b/lib/util/cache/package/decorator.spec.ts
@@ -1,6 +1,5 @@
 import os from 'os';
 import { mock } from 'jest-mock-extended';
-import { getName } from '../../../../test/util';
 import type { GetReleasesConfig } from '../../../datasource';
 import * as memCache from '../memory';
 import { cache } from './decorator';
@@ -8,7 +7,7 @@ import * as packageCache from '.';
 
 jest.mock('./file');
 
-describe(getName(), () => {
+describe('util/cache/package/decorator', () => {
   const spy = jest.fn(() => Promise.resolve());
 
   beforeAll(() => {
diff --git a/lib/util/cache/package/file.spec.ts b/lib/util/cache/package/file.spec.ts
index 8587885822c506892cfeced36a0910bf5d03e0b1..159283398ac86a0fb423d00d69fcaa2d05759448 100644
--- a/lib/util/cache/package/file.spec.ts
+++ b/lib/util/cache/package/file.spec.ts
@@ -1,8 +1,7 @@
 import os from 'os';
-import { getName } from '../../../../test/util';
 import { get, init, set } from './file';
 
-describe(getName(), () => {
+describe('util/cache/package/file', () => {
   it('returns if uninitiated', async () => {
     await set('test', 'key', 1234);
     expect(await get('test', 'key')).toBeUndefined();
diff --git a/lib/util/cache/package/index.spec.ts b/lib/util/cache/package/index.spec.ts
index 63f6e32a8997301c437199e176f37bf5d011c8cd..cd419e644e63a971a58144859d52519296ba7a55 100644
--- a/lib/util/cache/package/index.spec.ts
+++ b/lib/util/cache/package/index.spec.ts
@@ -1,10 +1,9 @@
-import { getName } from '../../../../test/util';
 import { cleanup, get, init, set } from '.';
 
 jest.mock('./file');
 jest.mock('./redis');
 
-describe(getName(), () => {
+describe('util/cache/package/index', () => {
   it('returns undefined if not initialized', async () => {
     expect(await get('test', 'missing-key')).toBeUndefined();
     expect(await set('test', 'some-key', 'some-value', 5)).toBeUndefined();
diff --git a/lib/util/cache/repository/index.spec.ts b/lib/util/cache/repository/index.spec.ts
index 85f5251c3b63931d0bc60891493e0bed2bfc1165..2fe02ba3cd546c276ea2dc4898d5ff97bc2c1d00 100644
--- a/lib/util/cache/repository/index.spec.ts
+++ b/lib/util/cache/repository/index.spec.ts
@@ -1,5 +1,5 @@
 import * as _fs from 'fs-extra';
-import { getName, mocked } from '../../../../test/util';
+import { mocked } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import * as repositoryCache from '.';
 
@@ -7,7 +7,7 @@ jest.mock('fs-extra');
 
 const fs = mocked(_fs);
 
-describe(getName(), () => {
+describe('util/cache/repository/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     setGlobalConfig({ cacheDir: '/tmp/renovate/cache/' });
diff --git a/lib/util/emoji.spec.ts b/lib/util/emoji.spec.ts
index 5c7083d7b284ce6edbf5c5419643b05cb3b6cc28..969563e339565ae04e3fe140c8a879f94d8a1e38 100644
--- a/lib/util/emoji.spec.ts
+++ b/lib/util/emoji.spec.ts
@@ -1,8 +1,7 @@
 import { fromCodepointToUnicode, fromHexcodeToCodepoint } from 'emojibase';
-import { getName } from '../../test/util';
 import { emojify, setEmojiConfig, stripEmojis, unemojify } from './emoji';
 
-describe(getName(), () => {
+describe('util/emoji', () => {
   beforeEach(() => {
     setEmojiConfig({ unicodeEmoji: true });
   });
diff --git a/lib/util/exec/docker/index.spec.ts b/lib/util/exec/docker/index.spec.ts
index bf5c746a3de5d977ba110727531eb3ea4a94b753..5c8f35b1f0c96d9c32fa130be915b4caccc2f9f4 100644
--- a/lib/util/exec/docker/index.spec.ts
+++ b/lib/util/exec/docker/index.spec.ts
@@ -3,7 +3,6 @@ import {
   mockExecAll,
   mockExecSequence,
 } from '../../../../test/exec-util';
-import { getName } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import { SYSTEM_INSUFFICIENT_MEMORY } from '../../../constants/error-messages';
 import { getPkgReleases as _getPkgReleases } from '../../../datasource';
@@ -24,7 +23,7 @@ const getPkgReleases: jest.Mock<typeof _getPkgReleases> =
   _getPkgReleases as any;
 jest.mock('../../../datasource');
 
-describe(getName(), () => {
+describe('util/exec/docker/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
   });
diff --git a/lib/util/exec/env.spec.ts b/lib/util/exec/env.spec.ts
index 65379476ae0989fd0db241763bff36150138ce1e..d6a4d09bf52c5f9ceb5ac870627f6bd07fcd87af 100644
--- a/lib/util/exec/env.spec.ts
+++ b/lib/util/exec/env.spec.ts
@@ -1,7 +1,7 @@
 import { setGlobalConfig } from '../../config/global';
 import { getChildProcessEnv } from './env';
 
-describe('getChildProcess environment when trustlevel set to low', () => {
+describe('util/exec/env', () => {
   const envVars = [
     'HTTP_PROXY',
     'HTTPS_PROXY',
diff --git a/lib/util/exec/index.spec.ts b/lib/util/exec/index.spec.ts
index 596ca3606c6d21a0d12fffad1121e2d31b9acbab..f1aee6700d433390d7c34095a3f36f31e731886f 100644
--- a/lib/util/exec/index.spec.ts
+++ b/lib/util/exec/index.spec.ts
@@ -4,7 +4,6 @@ import {
   exec as _cpExec,
 } from 'child_process';
 import { envMock } from '../../../test/exec-util';
-import { getName } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import { TEMPORARY_ERROR } from '../../constants/error-messages';
@@ -25,7 +24,7 @@ interface TestInput {
   adminConfig?: Partial<RepoGlobalConfig>;
 }
 
-describe(getName(), () => {
+describe('util/exec/index', () => {
   let processEnvOrig: NodeJS.ProcessEnv;
 
   const cacheDir = '/tmp/renovate/cache/';
diff --git a/lib/util/fs/index.spec.ts b/lib/util/fs/index.spec.ts
index 30f4da713028ce18c02ac9889cd338214cd39d11..2add18ff78231ba337417ef9b3f646090bcd15de 100644
--- a/lib/util/fs/index.spec.ts
+++ b/lib/util/fs/index.spec.ts
@@ -1,7 +1,7 @@
 import { withDir } from 'tmp-promise';
 import { join } from 'upath';
 import { envMock } from '../../../test/exec-util';
-import { getName, mocked } from '../../../test/util';
+import { mocked } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import * as _env from '../exec/env';
 import {
@@ -19,7 +19,7 @@ import {
 jest.mock('../../util/exec/env');
 const env = mocked(_env);
 
-describe(getName(), () => {
+describe('util/fs/index', () => {
   describe('readLocalFile', () => {
     beforeEach(() => {
       setGlobalConfig({ localDir: '' });
@@ -37,9 +37,7 @@ describe(getName(), () => {
       expect(await readLocalFile(__dirname)).toBeNull();
     });
   });
-});
 
-describe(getName(), () => {
   describe('localPathExists', () => {
     it('returns true for file', async () => {
       expect(await localPathExists(__filename)).toBe(true);
@@ -53,9 +51,7 @@ describe(getName(), () => {
       );
     });
   });
-});
 
-describe(getName(), () => {
   describe('findLocalSiblingOrParent', () => {
     it('returns path for file', async () => {
       await withDir(
diff --git a/lib/util/fs/proxies.spec.ts b/lib/util/fs/proxies.spec.ts
index 1d04cced94a6d52450371386e93e34b6b320ccfa..c2d057e93c159b36e41aa54c5e904ca03f8d042b 100644
--- a/lib/util/fs/proxies.spec.ts
+++ b/lib/util/fs/proxies.spec.ts
@@ -1,10 +1,9 @@
 import * as fs from 'fs-extra';
-import { getName } from '../../../test/util';
 import { remove } from './proxies';
 
 jest.mock('fs-extra');
 
-describe(getName(), () => {
+describe('util/fs/proxies', () => {
   describe('remove', () => {
     it('should call remove in fs-extra', async () => {
       (fs.remove as jest.Mock).mockResolvedValue(undefined);
diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts
index 32a009763db9ae909b2ae414eed892eecacd7bab..c9232b60f58fa9feb97730bfaf61b41ac0ad7245 100644
--- a/lib/util/git/index.spec.ts
+++ b/lib/util/git/index.spec.ts
@@ -2,12 +2,11 @@ import fs from 'fs-extra';
 import Git from 'simple-git';
 import SimpleGit from 'simple-git/src/git';
 import tmp from 'tmp-promise';
-import { getName } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import * as git from '.';
 import { GitNoVerifyOption, setNoVerify } from '.';
 
-describe(getName(), () => {
+describe('util/git/index', () => {
   jest.setTimeout(15000);
 
   const masterCommitDate = new Date();
diff --git a/lib/util/git/private-key.spec.ts b/lib/util/git/private-key.spec.ts
index 964c80271f8f723528ded76e9965bcc0a67e2dd2..8349f573fda7f5bf5d2ce5e648a67a0fdd0bb044 100644
--- a/lib/util/git/private-key.spec.ts
+++ b/lib/util/git/private-key.spec.ts
@@ -1,4 +1,4 @@
-import { getName, mocked } from '../../../test/util';
+import { mocked } from '../../../test/util';
 import * as exec_ from '../exec';
 import {
   configSigningKey,
@@ -11,7 +11,7 @@ jest.mock('../exec');
 
 const exec = mocked(exec_);
 
-describe(getName(), () => {
+describe('util/git/private-key', () => {
   describe('writePrivateKey()', () => {
     it('returns if no private key', async () => {
       await expect(writePrivateKey()).resolves.not.toThrow();
diff --git a/lib/util/git/url.spec.ts b/lib/util/git/url.spec.ts
index bc8dc6e8556099cc355801c8a7955ff290f53ffe..eceb04c32c2cbe13150ed70d02d8e6de66b3cfcd 100644
--- a/lib/util/git/url.spec.ts
+++ b/lib/util/git/url.spec.ts
@@ -1,9 +1,9 @@
-import { getName, hostRules } from '../../../test/util';
+import { hostRules } from '../../../test/util';
 import { getHttpUrl, getRemoteUrlWithToken } from './url';
 
 jest.mock('../host-rules');
 
-describe(getName(), () => {
+describe('util/git/url', () => {
   describe('getHttpUrl()', () => {
     it('returns https url for git url', () => {
       expect(getHttpUrl('git://foo.bar/')).toBe('https://foo.bar/');
diff --git a/lib/util/host-rules.spec.ts b/lib/util/host-rules.spec.ts
index 04d6060f0827508642964ec654ec9d676189bae2..145bc919377bc2a102aeffe7612f7d6e408ddcbc 100644
--- a/lib/util/host-rules.spec.ts
+++ b/lib/util/host-rules.spec.ts
@@ -1,9 +1,8 @@
-import { getName } from '../../test/util';
 import { PLATFORM_TYPE_AZURE } from '../constants/platforms';
 import * as datasourceNuget from '../datasource/nuget';
 import { add, clear, find, findAll, hosts } from './host-rules';
 
-describe(getName(), () => {
+describe('util/host-rules', () => {
   beforeEach(() => {
     clear();
   });
diff --git a/lib/util/html.spec.ts b/lib/util/html.spec.ts
index 7509826c3fec3aaf37b2e5071f789226f5a90c11..c4727d82341aaf9e85e033f6916baa5899ef3daa 100644
--- a/lib/util/html.spec.ts
+++ b/lib/util/html.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import { HTMLElement, parse } from './html';
 
-describe(getName(), () => {
+describe('util/html', () => {
   it('parses HTML', () => {
     const body = parse('<div>Hello, world!</div>');
     expect(body.childNodes).toHaveLength(1);
diff --git a/lib/util/http/auth.spec.ts b/lib/util/http/auth.spec.ts
index bae9ce80bd988431a27532b8b7618aaa093aedec..11d5c9d877d09d6b7a47e654698ea79445c7a602 100644
--- a/lib/util/http/auth.spec.ts
+++ b/lib/util/http/auth.spec.ts
@@ -1,5 +1,5 @@
 import { NormalizedOptions } from 'got';
-import { getName, partial } from '../../../test/util';
+import { partial } from '../../../test/util';
 import {
   PLATFORM_TYPE_GITEA,
   PLATFORM_TYPE_GITLAB,
@@ -7,7 +7,7 @@ import {
 import { applyAuthorization, removeAuthorization } from './auth';
 import { GotOptions } from './types';
 
-describe(getName(), () => {
+describe('util/http/auth', () => {
   describe('applyAuthorization', () => {
     it('does nothing', () => {
       const opts: GotOptions = {
diff --git a/lib/util/http/bitbucket-server.spec.ts b/lib/util/http/bitbucket-server.spec.ts
index 149f6fe182c731c6b39ee27c5077f5d2e140b35d..65cf77d7d607ae722e6ea34627c85ebca5e17a51 100644
--- a/lib/util/http/bitbucket-server.spec.ts
+++ b/lib/util/http/bitbucket-server.spec.ts
@@ -1,12 +1,11 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { PLATFORM_TYPE_BITBUCKET_SERVER } from '../../constants/platforms';
 import * as hostRules from '../host-rules';
 import { BitbucketServerHttp, setBaseUrl } from './bitbucket-server';
 
 const baseUrl = 'https://git.example.com';
 
-describe(getName(), () => {
+describe('util/http/bitbucket-server', () => {
   let api: BitbucketServerHttp;
   beforeEach(() => {
     api = new BitbucketServerHttp();
diff --git a/lib/util/http/bitbucket.spec.ts b/lib/util/http/bitbucket.spec.ts
index 17fe677e9b11b9fc20fc562db79c61e19546c172..ace4b8a50c755a03aa7c07550397b0867957008c 100644
--- a/lib/util/http/bitbucket.spec.ts
+++ b/lib/util/http/bitbucket.spec.ts
@@ -1,12 +1,11 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { PLATFORM_TYPE_BITBUCKET } from '../../constants/platforms';
 import * as hostRules from '../host-rules';
 import { BitbucketHttp, setBaseUrl } from './bitbucket';
 
 const baseUrl = 'https://api.bitbucket.org';
 
-describe(getName(), () => {
+describe('util/http/bitbucket', () => {
   let api: BitbucketHttp;
   beforeEach(() => {
     api = new BitbucketHttp();
diff --git a/lib/util/http/gitea.spec.ts b/lib/util/http/gitea.spec.ts
index b3043b9bc1bc3d5fcb3315112cbe215efc5fcdda..3d1645181b23eb638e45bbbcca3cd50cacd176bc 100644
--- a/lib/util/http/gitea.spec.ts
+++ b/lib/util/http/gitea.spec.ts
@@ -1,8 +1,7 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { GiteaHttp, setBaseUrl } from './gitea';
 
-describe(getName(), () => {
+describe('util/http/gitea', () => {
   const baseUrl = 'https://gitea.renovatebot.com/api/v1';
 
   let giteaHttp: GiteaHttp;
diff --git a/lib/util/http/github.spec.ts b/lib/util/http/github.spec.ts
index c5bd6b6e26e2dd1048847184329ea690d962ffc8..53111f6cc2ec68083db2d11e9b7ee61f6b98b598 100644
--- a/lib/util/http/github.spec.ts
+++ b/lib/util/http/github.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import {
   EXTERNAL_HOST_ERROR,
   PLATFORM_BAD_CREDENTIALS,
@@ -38,7 +37,7 @@ query(
 }
 `;
 
-describe(getName(), () => {
+describe('util/http/github', () => {
   let githubApi: GithubHttp;
   beforeEach(() => {
     githubApi = new GithubHttp();
diff --git a/lib/util/http/gitlab.spec.ts b/lib/util/http/gitlab.spec.ts
index fff760d17da4255b92905d8e5fdd30aaf30f550c..acd7c6d9892eeeeeb5d2625de1f9f69fc8240ce2 100644
--- a/lib/util/http/gitlab.spec.ts
+++ b/lib/util/http/gitlab.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { PLATFORM_TYPE_GITLAB } from '../../constants/platforms';
 import * as hostRules from '../host-rules';
@@ -13,7 +12,7 @@ hostRules.add({
 const gitlabApiHost = 'https://gitlab.com';
 const selfHostedUrl = 'http://mycompany.com/gitlab';
 
-describe(getName(), () => {
+describe('util/http/gitlab', () => {
   let gitlabApi: GitlabHttp;
 
   beforeEach(() => {
diff --git a/lib/util/http/host-rules.spec.ts b/lib/util/http/host-rules.spec.ts
index 46d584e6b802c95617e9abb96083385eae7026d9..ea59b0461ff26721b70ef1da4e73a3dbd1312b40 100644
--- a/lib/util/http/host-rules.spec.ts
+++ b/lib/util/http/host-rules.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import {
   PLATFORM_TYPE_GITEA,
   PLATFORM_TYPE_GITHUB,
@@ -11,7 +10,7 @@ const url = 'https://github.com';
 
 jest.mock('global-agent');
 
-describe(getName(), () => {
+describe('util/http/host-rules', () => {
   const options = {
     hostType: PLATFORM_TYPE_GITHUB,
   };
diff --git a/lib/util/http/index.spec.ts b/lib/util/http/index.spec.ts
index 22df8fac6500943403895fc0bd171a958656b07a..d7c7531a46ed81c6cea8cb48eb085647392eef75 100644
--- a/lib/util/http/index.spec.ts
+++ b/lib/util/http/index.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import {
   EXTERNAL_HOST_ERROR,
   HOST_DISABLED,
@@ -10,7 +9,7 @@ import { Http } from '.';
 
 const baseUrl = 'http://renovate.com';
 
-describe(getName(), () => {
+describe('util/http/index', () => {
   let http: Http;
 
   beforeEach(() => {
diff --git a/lib/util/http/queue.spec.ts b/lib/util/http/queue.spec.ts
index 585a7a29db66f7cd2f4483579e74caff5836d362..bda615afdf81b0f8afe782d3a4225b7f44c9cf78 100644
--- a/lib/util/http/queue.spec.ts
+++ b/lib/util/http/queue.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { getQueue } from './queue';
 
-describe(getName(), () => {
+describe('util/http/queue', () => {
   it('returns null for invalid URL', () => {
     expect(getQueue(null)).toBeNull();
   });
diff --git a/lib/util/index.spec.ts b/lib/util/index.spec.ts
index 7c4ae4f9ab22f50de57222433da422352fb90760..2f2e7e85840841be34b8d974fae0fa05b5bd19c6 100644
--- a/lib/util/index.spec.ts
+++ b/lib/util/index.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import { sampleSize } from '.';
 
-describe(getName(), () => {
+describe('util/index', () => {
   describe('sampleSize', () => {
     const array = ['a', 'b', 'c', 'd'];
     it('returns correct sized array', () => {
diff --git a/lib/util/markdown.spec.ts b/lib/util/markdown.spec.ts
index 99bf435235e00aaba45344fd87d1d51db4f87567..022a2535d2943a5775a9ea30868dc2e1beccc494 100644
--- a/lib/util/markdown.spec.ts
+++ b/lib/util/markdown.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import { linkify } from './markdown';
 
-describe(getName(), () => {
+describe('util/markdown', () => {
   describe('.linkify', () => {
     const md = `Some references:
 
diff --git a/lib/util/mask.spec.ts b/lib/util/mask.spec.ts
index c67ed2818e169ee9116074cd2d251121d04b1b45..7d0753ba9604d2a0930c7bd5399e37c3ac095e43 100644
--- a/lib/util/mask.spec.ts
+++ b/lib/util/mask.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import { maskToken } from './mask';
 
-describe(getName(), () => {
+describe('util/mask', () => {
   describe('.maskToken', () => {
     it('returns value if passed value is falsy', () => {
       expect(maskToken('')).toEqual('');
diff --git a/lib/util/merge-confidence/index.spec.ts b/lib/util/merge-confidence/index.spec.ts
index 99f6d009e0520963711d66f92e4a76ddc67720a0..6c636107f896ac5ef3f7fcf9fb8a8b18f1ce23b1 100644
--- a/lib/util/merge-confidence/index.spec.ts
+++ b/lib/util/merge-confidence/index.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
 import * as memCache from '../cache/memory';
 import * as hostRules from '../host-rules';
 import {
@@ -8,7 +7,7 @@ import {
   satisfiesConfidenceLevel,
 } from '.';
 
-describe(getName(), () => {
+describe('util/merge-confidence/index', () => {
   describe('isActiveConfidenceLevel()', () => {
     it('returns false if null', () => {
       expect(isActiveConfidenceLevel(null)).toBe(false);
diff --git a/lib/util/object.spec.ts b/lib/util/object.spec.ts
index 129c2d3bcdd8330f2fdc0334989c15fe030b0d75..bfc925898efeace5a9f40d5c201f990a620d1404 100644
--- a/lib/util/object.spec.ts
+++ b/lib/util/object.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import { hasKey } from './object';
 
-describe(getName(), () => {
+describe('util/object', () => {
   beforeEach(() => {
     jest.resetModules();
   });
diff --git a/lib/util/package-rules.spec.ts b/lib/util/package-rules.spec.ts
index f8421af282510d7a3eca29581d9f2bdf46786206..fd074d61f4ea194b32524738423a5f690053f32e 100644
--- a/lib/util/package-rules.spec.ts
+++ b/lib/util/package-rules.spec.ts
@@ -16,7 +16,7 @@ type TestConfig = PackageRuleInputConfig & {
   groupName?: string;
 };
 
-describe('applyPackageRules()', () => {
+describe('util/package-rules', () => {
   const config1: TestConfig = {
     foo: 'bar',
 
diff --git a/lib/util/regex.spec.ts b/lib/util/regex.spec.ts
index d1f40fac2a9703a946fac057f09e3867bef207a8..b0dad6a8b310e9959316fb9bd18b4d972f2c256d 100644
--- a/lib/util/regex.spec.ts
+++ b/lib/util/regex.spec.ts
@@ -1,10 +1,9 @@
 // eslint-disable-next-line import/no-extraneous-dependencies
 import RE2 from 're2';
-import { getName } from '../../test/util';
 import { CONFIG_VALIDATION } from '../constants/error-messages';
 import { regEx } from './regex';
 
-describe(getName(), () => {
+describe('util/regex', () => {
   beforeEach(() => {
     jest.resetModules();
   });
diff --git a/lib/util/sanitize.spec.ts b/lib/util/sanitize.spec.ts
index a91c0a475144bc80a75d4fc17217a76ff153cdc8..db76bc89fb3125e9eaee68c1525eb088e98540a9 100644
--- a/lib/util/sanitize.spec.ts
+++ b/lib/util/sanitize.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import { add, clear, sanitize } from './sanitize';
 
-describe(getName(), () => {
+describe('util/sanitize', () => {
   beforeEach(() => {
     clear();
   });
diff --git a/lib/util/split.spec.ts b/lib/util/split.spec.ts
index 856cff8ad1d3ae2f3c3b27fc5136d308f1eef492..f1f6260bfcae16353234933edde193bb7f78c3a9 100644
--- a/lib/util/split.spec.ts
+++ b/lib/util/split.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../test/util';
 import { addSplit, getSplits, splitInit } from './split';
 
-describe(getName(), () => {
+describe('util/split', () => {
   it('adds splits and returns results', () => {
     splitInit();
     addSplit('one');
diff --git a/lib/util/template/index.spec.ts b/lib/util/template/index.spec.ts
index a6788320edfe6dd4753d0ee4e3319b1ab745b27f..0df9844e692c4ba16e249274745fa286b5d16991 100644
--- a/lib/util/template/index.spec.ts
+++ b/lib/util/template/index.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../test/util';
 import { getOptions } from '../../config/options';
 import * as template from '.';
 
-describe(getName(), () => {
+describe('util/template/index', () => {
   it('has valid exposed config options', () => {
     const allOptions = getOptions().map((option) => option.name);
     const missingOptions = template.exposedConfigOptions.filter(
diff --git a/lib/util/url.spec.ts b/lib/util/url.spec.ts
index a3ed562d9ae067ecda6e5fd1f22e4e4ed505a70b..c425ef9eb7a58cd6a62e26cdc9b3cab72a4093a6 100644
--- a/lib/util/url.spec.ts
+++ b/lib/util/url.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../test/util';
 import {
   ensurePathPrefix,
   parseUrl,
@@ -7,7 +6,7 @@ import {
   validateUrl,
 } from './url';
 
-describe(getName(), () => {
+describe('util/url', () => {
   test.each([
     ['http://foo.io', '', 'http://foo.io'],
     ['http://foo.io/', '', 'http://foo.io'],
diff --git a/lib/versioning/__snapshots__/index.spec.ts.snap b/lib/versioning/__snapshots__/index.spec.ts.snap
index 98f8f8f87457a22bbbc93b89441beaaeb06540cd..475eeaec6909c7f494ad84f4e50da939fe82a3e8 100644
--- a/lib/versioning/__snapshots__/index.spec.ts.snap
+++ b/lib/versioning/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`allVersioning.get(versioning) has api 1`] = `
+exports[`versioning/index has api 1`] = `
 Array [
   "equals",
   "getMajor",
diff --git a/lib/versioning/composer/index.spec.ts b/lib/versioning/composer/index.spec.ts
index b8ec0e72baa5a06bb5acb9836123155737b13634..2c8683cf48d394df546bd03ca388e7196e56293a 100644
--- a/lib/versioning/composer/index.spec.ts
+++ b/lib/versioning/composer/index.spec.ts
@@ -1,536 +1,538 @@
 import { api as semver } from '.';
 
-describe('semver.getPatch(input)', () => {
-  it('gets patch', () => {
-    expect(semver.getPatch('1.2.0')).toEqual(0);
-  });
-});
-describe('semver.equals(a, b)', () => {
-  it('should pad short version', () => {
-    expect(semver.equals('1.2.0', 'v1.2')).toBe(true);
-  });
-  it('should pad really short version', () => {
-    expect(semver.equals('v1.0.0', '1')).toBe(true);
-  });
-  it('should translate stability modifier', () => {
-    expect(semver.equals('1.0@alpha3', '1.0.0-alpha.3')).toBe(true);
-    expect(semver.equals('1.0@beta', '1.0.0-beta')).toBe(true);
-    expect(semver.equals('1.0@rc2', '1.0.0-rc.2')).toBe(true);
-  });
-});
-describe('semver.isGreaterThan(a, b)', () => {
-  it('should pad short version', () => {
-    expect(semver.isGreaterThan('1.2.0', 'v1.2')).toBe(false);
-  });
-  it('should pad really short version', () => {
-    expect(semver.isGreaterThan('v1.0.1', '1')).toBe(true);
-  });
-  it('should pad both versions', () => {
-    expect(semver.isGreaterThan('1', '1.1')).toBe(false);
-  });
-});
-describe('semver.isSingleVersion(input)', () => {
-  it('should pad short version', () => {
-    expect(semver.isSingleVersion('v1.2')).toBeTruthy();
-  });
-});
-describe('semver.isStable(input)', () => {
-  it('should pad short version', () => {
-    expect(semver.isStable('v1.2')).toBeTruthy();
-  });
-});
-describe('semver.isValid(input)', () => {
-  it('should support simple semver', () => {
-    expect(semver.isValid('1.2.3')).toBeTruthy();
-  });
-  it('should support semver with dash', () => {
-    expect(semver.isValid('1.2.3-foo')).toBeTruthy();
-  });
-  it('should reject semver without dash', () => {
-    expect(semver.isValid('1.2.3foo')).toBeFalsy();
-  });
-  it('should support ranges', () => {
-    expect(semver.isValid('~1.2.3')).toBeTruthy();
-    expect(semver.isValid('^1.2.3')).toBeTruthy();
-    expect(semver.isValid('>1.2.3')).toBeTruthy();
-  });
-  it('should support ranges with stability modifiers', () => {
-    expect(semver.isValid('~1.2.3-beta1')).toBeTruthy();
-    expect(semver.isValid('^1.2.3-alpha')).toBeTruthy();
-    expect(semver.isValid('>1.2.3-rc2')).toBeTruthy();
-  });
-  it('should support ranges with min-stability', () => {
-    expect(semver.isValid('~1.2.3@beta')).toBeTruthy();
-    expect(semver.isValid('^1.2.3@alpha')).toBeTruthy();
-    expect(semver.isValid('>1.2.3@rc')).toBeTruthy();
-  });
-});
-describe('semver.isVersion(input)', () => {
-  it('should support simple semver', () => {
-    expect(semver.isValid('1.2.3')).toBeTruthy();
-  });
-  it('should support shortened version', () => {
-    expect(semver.isValid('2.5')).toBeTruthy();
-  });
-  it('should support shortened v version', () => {
-    expect(semver.isValid('v2.5')).toBeTruthy();
-  });
-});
-describe('semver.isLessThanRange()', () => {
-  it('handles massaged tilde', () => {
-    expect(semver.isLessThanRange('0.3.1', '~0.4')).toBe(true);
-    expect(semver.isLessThanRange('0.5.1', '~0.4')).toBe(false);
-  });
-});
-describe('semver.getSatisfyingVersion()', () => {
-  it('handles massaged tilde', () => {
-    expect(
-      semver.getSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
-        '~4'
-      )
-    ).toBe('4.2.0');
-    expect(
-      semver.getSatisfyingVersion(
-        ['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0'],
-        '~4'
-      )
-    ).toBe('4.2.0');
-    expect(
-      semver.getSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
-        '~0.4'
-      )
-    ).toBe('0.5.0');
-  });
-  it('handles prereleases', () => {
-    expect(
-      semver.getSatisfyingVersion(
-        [
-          '0.4.0',
-          '0.5.0',
-          '4.0.0-beta1',
-          '4.0.0-beta2',
-          '4.2.0-beta1',
-          '4.2.0-beta2',
-          '5.0.0',
-        ],
-        '~4@beta'
-      )
-    ).toBe('4.0.0-beta2');
-  });
-});
-describe('semver.minSatisfyingVersion()', () => {
-  it('handles massaged tilde', () => {
-    expect(
-      semver.minSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
-        '~4'
-      )
-    ).toBe('4.0.0');
-    expect(
-      semver.minSatisfyingVersion(
-        ['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0'],
-        '~4'
-      )
-    ).toBe('4.0.0');
-    expect(
-      semver.minSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
-        '~0.4'
-      )
-    ).toBe('0.4.0');
-  });
-  it('handles prereleases', () => {
-    expect(
-      semver.minSatisfyingVersion(
-        [
-          '0.4.0',
-          '0.5.0',
-          '4.0.0-beta1',
-          '4.0.0',
-          '4.2.0-beta1',
-          '4.2.0-beta2',
-          '5.0.0',
-        ],
-        '~4@beta'
-      )
-    ).toBe('4.0.0-beta1');
-  });
-});
-describe('semver.matches()', () => {
-  it('handles massaged tilde', () => {
-    expect(semver.matches('0.3.1', '~0.4')).toBe(false);
-    expect(semver.matches('0.5.1', '~0.4')).toBe(true);
-  });
-});
-describe('semver.getNewValue()', () => {
-  it('returns pinned newVersion', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.0',
-        rangeStrategy: 'pin',
-        currentVersion: '1.0',
-        newVersion: 'V1.1',
-      })
-    ).toEqual('V1.1');
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.0',
-        rangeStrategy: 'pin',
-        currentVersion: '1.0',
-        newVersion: 'V1.1',
-      })
-    ).toEqual('V1.1');
-  });
-  it('returns newVersion', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: 'v1.0',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0',
-        newVersion: '1.1',
-      })
-    ).toEqual('v1.1');
-  });
-  it('bumps short caret to same', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.0.7',
-      })
-    ).toEqual('^1.0');
-  });
-  it('bumps less than to same', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '<2.7.14',
-        rangeStrategy: 'bump',
-        currentVersion: '2.0.3',
-        newVersion: '2.0.4',
-      })
-    ).toEqual('<2.7.14');
-  });
-  it('bumps caret to same', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.0.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.3.5',
-      })
-    ).toEqual('^1.3.5');
-  });
-  it('replaces caret to same', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0.0',
-        newVersion: '1.3.5',
-      })
-    ).toEqual('^1');
-  });
-  it('replaces short caret', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.0',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0.0',
-        newVersion: '2.3.5',
-      })
-    ).toEqual('^2.0');
-  });
-  it('handles tilde zero', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~0.2',
-        rangeStrategy: 'replace',
-        currentVersion: '0.2.0',
-        newVersion: '0.3.0',
-      })
-    ).toEqual('~0.3');
-    expect(
-      semver.getNewValue({
-        currentValue: '~0.2',
-        rangeStrategy: 'replace',
-        currentVersion: '0.2.0',
-        newVersion: '1.1.0',
-      })
-    ).toEqual('~1.0');
-  });
-  it('handles tilde major', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~4',
-        rangeStrategy: 'replace',
-        currentVersion: '4.0.0',
-        newVersion: '4.2.0',
-      })
-    ).toEqual('~4');
-    expect(
-      semver.getNewValue({
-        currentValue: '~4',
-        rangeStrategy: 'replace',
-        currentVersion: '4.0.0',
-        newVersion: '5.1.0',
-      })
-    ).toEqual('~5');
-  });
-  it('handles tilde minor', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~4.0',
-        rangeStrategy: 'replace',
-        currentVersion: '4.0.0',
-        newVersion: '5.1.0',
-      })
-    ).toEqual('~5.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~4.0',
-        rangeStrategy: 'replace',
-        currentVersion: '4.0.0',
-        newVersion: '4.1.0',
-      })
-    ).toEqual('~4.1');
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.2 || ~2.0',
-        rangeStrategy: 'replace',
-        currentVersion: '2.0.0',
-        newVersion: '3.1.0',
-      })
-    ).toEqual('~3.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.2 || ~2.0 || ~3.0',
-        rangeStrategy: 'widen',
-        currentVersion: '2.0.0',
-        newVersion: '5.1.0',
-      })
-    ).toEqual('~1.2 || ~2.0 || ~3.0 || ~5.0');
-  });
-  it('handles widen strategy', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.2',
-        rangeStrategy: 'widen',
-        currentVersion: '1.2.0',
-        newVersion: '2.0.0',
-      })
-    ).toEqual('^1.2 || ^2.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.2',
-        rangeStrategy: 'widen',
-        currentVersion: '1.2.0',
-        newVersion: '2.4.0',
-      })
-    ).toEqual('~1.2 || ~2.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.2',
-        rangeStrategy: 'widen',
-        currentVersion: '1.2.0',
-        newVersion: '1.9.0',
-      })
-    ).toEqual('~1.2');
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.2',
-        rangeStrategy: 'widen',
-        currentVersion: '1.2.0',
-        newVersion: '1.9.0',
-      })
-    ).toEqual('^1.2');
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.0 || ^2.0',
-        rangeStrategy: 'widen',
-        currentVersion: '2.0.0',
-        newVersion: '2.1.0',
-      })
-    ).toEqual('^1.0 || ^2.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '>=1.0 <3.0',
-        rangeStrategy: 'widen',
-        currentVersion: '2.9.0',
-        newVersion: '4.1.0',
-      })
-    ).toEqual('>=1.0 <4.2');
-    expect(
-      semver.getNewValue({
-        currentValue: '>=1.0 <3.0',
-        rangeStrategy: 'widen',
-        currentVersion: '2.9.0',
-        newVersion: '2.9.5',
-      })
-    ).toEqual('>=1.0 <3.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '>=1.0 <3.0',
-        rangeStrategy: 'widen',
-        currentVersion: '2.9.0',
-        newVersion: '3.0',
-      })
-    ).toEqual('>=1.0 <3.1');
-    expect(
-      semver.getNewValue({
-        currentValue: '>=1.0.0 <=3.0.4',
-        rangeStrategy: 'widen',
-        currentVersion: '2.9.0',
-        newVersion: '3.0.5',
-      })
-    ).toEqual('>=1.0.0 <=3.0.5');
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.0 || >=3.0 <=4.0',
-        rangeStrategy: 'widen',
-        currentVersion: '2.9.0',
-        newVersion: '5.0.0',
-      })
-    ).toEqual('~1.0 || >=3.0 <=5.0');
-  });
-  it('returns newVersion if unsupported', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '+4.0.0',
-        rangeStrategy: 'replace',
-        currentVersion: '4.0.0',
-        newVersion: '4.2.0',
-      })
-    ).toEqual('4.2.0');
-  });
-  it('returns versioned newVersion', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: 'v4.0.0',
-        rangeStrategy: 'replace',
-        currentVersion: '4.0.0',
-        newVersion: '4.2.0',
-      })
-    ).toEqual('v4.2.0');
-  });
-  it('bumps short caret with v', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^v1.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.7',
-      })
-    ).toEqual('^v1.1');
-  });
-  it('bumps short caret with stability modifiers', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^v1.0@beta',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0-beta3',
-        newVersion: '1.0.0-beta5',
-      })
-    ).toEqual('^v1.0.0-beta5@beta');
-  });
-  it('replaces short caret with stability modifiers', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^v1.0@beta',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0.0-beta3',
-        newVersion: '2.0.0-beta5',
-      })
-    ).toEqual('^v2.0.0-beta5@beta');
-  });
-  it('preserves the current min-stability modifiers', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^4.0@alpha',
-        rangeStrategy: 'replace',
-        currentVersion: '4.0.0-alpha1',
-        newVersion: '4.0.0-beta5',
-      })
-    ).toEqual('^4.0.0-beta5@alpha');
-  });
-  it('handles differing lengths', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '3.6.*',
-        rangeStrategy: 'replace',
-        currentVersion: '3.6.0',
-        newVersion: '3.7',
-      })
-    ).toEqual('3.7.*');
+describe('versioning/composer/index', () => {
+  describe('semver.getPatch(input)', () => {
+    it('gets patch', () => {
+      expect(semver.getPatch('1.2.0')).toEqual(0);
+    });
+  });
+  describe('semver.equals(a, b)', () => {
+    it('should pad short version', () => {
+      expect(semver.equals('1.2.0', 'v1.2')).toBe(true);
+    });
+    it('should pad really short version', () => {
+      expect(semver.equals('v1.0.0', '1')).toBe(true);
+    });
+    it('should translate stability modifier', () => {
+      expect(semver.equals('1.0@alpha3', '1.0.0-alpha.3')).toBe(true);
+      expect(semver.equals('1.0@beta', '1.0.0-beta')).toBe(true);
+      expect(semver.equals('1.0@rc2', '1.0.0-rc.2')).toBe(true);
+    });
+  });
+  describe('semver.isGreaterThan(a, b)', () => {
+    it('should pad short version', () => {
+      expect(semver.isGreaterThan('1.2.0', 'v1.2')).toBe(false);
+    });
+    it('should pad really short version', () => {
+      expect(semver.isGreaterThan('v1.0.1', '1')).toBe(true);
+    });
+    it('should pad both versions', () => {
+      expect(semver.isGreaterThan('1', '1.1')).toBe(false);
+    });
+  });
+  describe('semver.isSingleVersion(input)', () => {
+    it('should pad short version', () => {
+      expect(semver.isSingleVersion('v1.2')).toBeTruthy();
+    });
+  });
+  describe('semver.isStable(input)', () => {
+    it('should pad short version', () => {
+      expect(semver.isStable('v1.2')).toBeTruthy();
+    });
+  });
+  describe('semver.isValid(input)', () => {
+    it('should support simple semver', () => {
+      expect(semver.isValid('1.2.3')).toBeTruthy();
+    });
+    it('should support semver with dash', () => {
+      expect(semver.isValid('1.2.3-foo')).toBeTruthy();
+    });
+    it('should reject semver without dash', () => {
+      expect(semver.isValid('1.2.3foo')).toBeFalsy();
+    });
+    it('should support ranges', () => {
+      expect(semver.isValid('~1.2.3')).toBeTruthy();
+      expect(semver.isValid('^1.2.3')).toBeTruthy();
+      expect(semver.isValid('>1.2.3')).toBeTruthy();
+    });
+    it('should support ranges with stability modifiers', () => {
+      expect(semver.isValid('~1.2.3-beta1')).toBeTruthy();
+      expect(semver.isValid('^1.2.3-alpha')).toBeTruthy();
+      expect(semver.isValid('>1.2.3-rc2')).toBeTruthy();
+    });
+    it('should support ranges with min-stability', () => {
+      expect(semver.isValid('~1.2.3@beta')).toBeTruthy();
+      expect(semver.isValid('^1.2.3@alpha')).toBeTruthy();
+      expect(semver.isValid('>1.2.3@rc')).toBeTruthy();
+    });
+  });
+  describe('semver.isVersion(input)', () => {
+    it('should support simple semver', () => {
+      expect(semver.isValid('1.2.3')).toBeTruthy();
+    });
+    it('should support shortened version', () => {
+      expect(semver.isValid('2.5')).toBeTruthy();
+    });
+    it('should support shortened v version', () => {
+      expect(semver.isValid('v2.5')).toBeTruthy();
+    });
+  });
+  describe('semver.isLessThanRange()', () => {
+    it('handles massaged tilde', () => {
+      expect(semver.isLessThanRange('0.3.1', '~0.4')).toBe(true);
+      expect(semver.isLessThanRange('0.5.1', '~0.4')).toBe(false);
+    });
+  });
+  describe('semver.getSatisfyingVersion()', () => {
+    it('handles massaged tilde', () => {
+      expect(
+        semver.getSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
+          '~4'
+        )
+      ).toBe('4.2.0');
+      expect(
+        semver.getSatisfyingVersion(
+          ['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0'],
+          '~4'
+        )
+      ).toBe('4.2.0');
+      expect(
+        semver.getSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
+          '~0.4'
+        )
+      ).toBe('0.5.0');
+    });
+    it('handles prereleases', () => {
+      expect(
+        semver.getSatisfyingVersion(
+          [
+            '0.4.0',
+            '0.5.0',
+            '4.0.0-beta1',
+            '4.0.0-beta2',
+            '4.2.0-beta1',
+            '4.2.0-beta2',
+            '5.0.0',
+          ],
+          '~4@beta'
+        )
+      ).toBe('4.0.0-beta2');
+    });
+  });
+  describe('semver.minSatisfyingVersion()', () => {
+    it('handles massaged tilde', () => {
+      expect(
+        semver.minSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
+          '~4'
+        )
+      ).toBe('4.0.0');
+      expect(
+        semver.minSatisfyingVersion(
+          ['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0'],
+          '~4'
+        )
+      ).toBe('4.0.0');
+      expect(
+        semver.minSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
+          '~0.4'
+        )
+      ).toBe('0.4.0');
+    });
+    it('handles prereleases', () => {
+      expect(
+        semver.minSatisfyingVersion(
+          [
+            '0.4.0',
+            '0.5.0',
+            '4.0.0-beta1',
+            '4.0.0',
+            '4.2.0-beta1',
+            '4.2.0-beta2',
+            '5.0.0',
+          ],
+          '~4@beta'
+        )
+      ).toBe('4.0.0-beta1');
+    });
+  });
+  describe('semver.matches()', () => {
+    it('handles massaged tilde', () => {
+      expect(semver.matches('0.3.1', '~0.4')).toBe(false);
+      expect(semver.matches('0.5.1', '~0.4')).toBe(true);
+    });
+  });
+  describe('semver.getNewValue()', () => {
+    it('returns pinned newVersion', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.0',
+          rangeStrategy: 'pin',
+          currentVersion: '1.0',
+          newVersion: 'V1.1',
+        })
+      ).toEqual('V1.1');
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.0',
+          rangeStrategy: 'pin',
+          currentVersion: '1.0',
+          newVersion: 'V1.1',
+        })
+      ).toEqual('V1.1');
+    });
+    it('returns newVersion', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: 'v1.0',
+          rangeStrategy: 'replace',
+          currentVersion: '1.0',
+          newVersion: '1.1',
+        })
+      ).toEqual('v1.1');
+    });
+    it('bumps short caret to same', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.0.7',
+        })
+      ).toEqual('^1.0');
+    });
+    it('bumps less than to same', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '<2.7.14',
+          rangeStrategy: 'bump',
+          currentVersion: '2.0.3',
+          newVersion: '2.0.4',
+        })
+      ).toEqual('<2.7.14');
+    });
+    it('bumps caret to same', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.0.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.3.5',
+        })
+      ).toEqual('^1.3.5');
+    });
+    it('replaces caret to same', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1',
+          rangeStrategy: 'replace',
+          currentVersion: '1.0.0',
+          newVersion: '1.3.5',
+        })
+      ).toEqual('^1');
+    });
+    it('replaces short caret', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.0',
+          rangeStrategy: 'replace',
+          currentVersion: '1.0.0',
+          newVersion: '2.3.5',
+        })
+      ).toEqual('^2.0');
+    });
+    it('handles tilde zero', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~0.2',
+          rangeStrategy: 'replace',
+          currentVersion: '0.2.0',
+          newVersion: '0.3.0',
+        })
+      ).toEqual('~0.3');
+      expect(
+        semver.getNewValue({
+          currentValue: '~0.2',
+          rangeStrategy: 'replace',
+          currentVersion: '0.2.0',
+          newVersion: '1.1.0',
+        })
+      ).toEqual('~1.0');
+    });
+    it('handles tilde major', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~4',
+          rangeStrategy: 'replace',
+          currentVersion: '4.0.0',
+          newVersion: '4.2.0',
+        })
+      ).toEqual('~4');
+      expect(
+        semver.getNewValue({
+          currentValue: '~4',
+          rangeStrategy: 'replace',
+          currentVersion: '4.0.0',
+          newVersion: '5.1.0',
+        })
+      ).toEqual('~5');
+    });
+    it('handles tilde minor', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~4.0',
+          rangeStrategy: 'replace',
+          currentVersion: '4.0.0',
+          newVersion: '5.1.0',
+        })
+      ).toEqual('~5.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~4.0',
+          rangeStrategy: 'replace',
+          currentVersion: '4.0.0',
+          newVersion: '4.1.0',
+        })
+      ).toEqual('~4.1');
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.2 || ~2.0',
+          rangeStrategy: 'replace',
+          currentVersion: '2.0.0',
+          newVersion: '3.1.0',
+        })
+      ).toEqual('~3.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.2 || ~2.0 || ~3.0',
+          rangeStrategy: 'widen',
+          currentVersion: '2.0.0',
+          newVersion: '5.1.0',
+        })
+      ).toEqual('~1.2 || ~2.0 || ~3.0 || ~5.0');
+    });
+    it('handles widen strategy', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.2',
+          rangeStrategy: 'widen',
+          currentVersion: '1.2.0',
+          newVersion: '2.0.0',
+        })
+      ).toEqual('^1.2 || ^2.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.2',
+          rangeStrategy: 'widen',
+          currentVersion: '1.2.0',
+          newVersion: '2.4.0',
+        })
+      ).toEqual('~1.2 || ~2.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.2',
+          rangeStrategy: 'widen',
+          currentVersion: '1.2.0',
+          newVersion: '1.9.0',
+        })
+      ).toEqual('~1.2');
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.2',
+          rangeStrategy: 'widen',
+          currentVersion: '1.2.0',
+          newVersion: '1.9.0',
+        })
+      ).toEqual('^1.2');
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.0 || ^2.0',
+          rangeStrategy: 'widen',
+          currentVersion: '2.0.0',
+          newVersion: '2.1.0',
+        })
+      ).toEqual('^1.0 || ^2.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '>=1.0 <3.0',
+          rangeStrategy: 'widen',
+          currentVersion: '2.9.0',
+          newVersion: '4.1.0',
+        })
+      ).toEqual('>=1.0 <4.2');
+      expect(
+        semver.getNewValue({
+          currentValue: '>=1.0 <3.0',
+          rangeStrategy: 'widen',
+          currentVersion: '2.9.0',
+          newVersion: '2.9.5',
+        })
+      ).toEqual('>=1.0 <3.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '>=1.0 <3.0',
+          rangeStrategy: 'widen',
+          currentVersion: '2.9.0',
+          newVersion: '3.0',
+        })
+      ).toEqual('>=1.0 <3.1');
+      expect(
+        semver.getNewValue({
+          currentValue: '>=1.0.0 <=3.0.4',
+          rangeStrategy: 'widen',
+          currentVersion: '2.9.0',
+          newVersion: '3.0.5',
+        })
+      ).toEqual('>=1.0.0 <=3.0.5');
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.0 || >=3.0 <=4.0',
+          rangeStrategy: 'widen',
+          currentVersion: '2.9.0',
+          newVersion: '5.0.0',
+        })
+      ).toEqual('~1.0 || >=3.0 <=5.0');
+    });
+    it('returns newVersion if unsupported', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '+4.0.0',
+          rangeStrategy: 'replace',
+          currentVersion: '4.0.0',
+          newVersion: '4.2.0',
+        })
+      ).toEqual('4.2.0');
+    });
+    it('returns versioned newVersion', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: 'v4.0.0',
+          rangeStrategy: 'replace',
+          currentVersion: '4.0.0',
+          newVersion: '4.2.0',
+        })
+      ).toEqual('v4.2.0');
+    });
+    it('bumps short caret with v', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^v1.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.7',
+        })
+      ).toEqual('^v1.1');
+    });
+    it('bumps short caret with stability modifiers', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^v1.0@beta',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0-beta3',
+          newVersion: '1.0.0-beta5',
+        })
+      ).toEqual('^v1.0.0-beta5@beta');
+    });
+    it('replaces short caret with stability modifiers', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^v1.0@beta',
+          rangeStrategy: 'replace',
+          currentVersion: '1.0.0-beta3',
+          newVersion: '2.0.0-beta5',
+        })
+      ).toEqual('^v2.0.0-beta5@beta');
+    });
+    it('preserves the current min-stability modifiers', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^4.0@alpha',
+          rangeStrategy: 'replace',
+          currentVersion: '4.0.0-alpha1',
+          newVersion: '4.0.0-beta5',
+        })
+      ).toEqual('^4.0.0-beta5@alpha');
+    });
+    it('handles differing lengths', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '3.6.*',
+          rangeStrategy: 'replace',
+          currentVersion: '3.6.0',
+          newVersion: '3.7',
+        })
+      ).toEqual('3.7.*');
 
-    expect(
-      semver.getNewValue({
-        currentValue: 'v3.1.*',
-        rangeStrategy: 'replace',
-        currentVersion: '3.1.10',
-        newVersion: '3.2.0',
-      })
-    ).toEqual('v3.2.*'); // #5388
-  });
-  it('handles update-lockfile strategy', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^0.1',
-        rangeStrategy: 'update-lockfile',
-        currentVersion: '0.1.0',
-        newVersion: '0.1.1',
-      })
-    ).toEqual('^0.1');
-    expect(
-      semver.getNewValue({
-        currentValue: '^0.1',
-        rangeStrategy: 'update-lockfile',
-        currentVersion: '0.1.0',
-        newVersion: '0.2.0',
-      })
-    ).toEqual('^0.2');
+      expect(
+        semver.getNewValue({
+          currentValue: 'v3.1.*',
+          rangeStrategy: 'replace',
+          currentVersion: '3.1.10',
+          newVersion: '3.2.0',
+        })
+      ).toEqual('v3.2.*'); // #5388
+    });
+    it('handles update-lockfile strategy', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^0.1',
+          rangeStrategy: 'update-lockfile',
+          currentVersion: '0.1.0',
+          newVersion: '0.1.1',
+        })
+      ).toEqual('^0.1');
+      expect(
+        semver.getNewValue({
+          currentValue: '^0.1',
+          rangeStrategy: 'update-lockfile',
+          currentVersion: '0.1.0',
+          newVersion: '0.2.0',
+        })
+      ).toEqual('^0.2');
 
-    expect(
-      semver.getNewValue({
-        currentValue: '^5.1',
-        rangeStrategy: 'update-lockfile',
-        currentVersion: '5.1.0',
-        newVersion: '5.2.0',
-      })
-    ).toEqual('^5.1');
-    expect(
-      semver.getNewValue({
-        currentValue: '^5.1',
-        rangeStrategy: 'update-lockfile',
-        currentVersion: '5.1.0',
-        newVersion: '6.0.0',
-      })
-    ).toEqual('^6.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '^5.1',
+          rangeStrategy: 'update-lockfile',
+          currentVersion: '5.1.0',
+          newVersion: '5.2.0',
+        })
+      ).toEqual('^5.1');
+      expect(
+        semver.getNewValue({
+          currentValue: '^5.1',
+          rangeStrategy: 'update-lockfile',
+          currentVersion: '5.1.0',
+          newVersion: '6.0.0',
+        })
+      ).toEqual('^6.0');
 
-    expect(
-      semver.getNewValue({
-        currentValue: '^5',
-        rangeStrategy: 'update-lockfile',
-        currentVersion: '5.1.0',
-        newVersion: '5.2.0',
-      })
-    ).toEqual('^5');
-    expect(
-      semver.getNewValue({
-        currentValue: '^5',
-        rangeStrategy: 'update-lockfile',
-        currentVersion: '5.1.0',
-        newVersion: '6.0.0',
-      })
-    ).toEqual('^6');
-  });
-});
-describe('.sortVersions', () => {
-  it('sorts versions in an ascending order', () => {
-    expect(
-      ['1.2.3-beta', '2.0.1', '1.3.4', '1.2.3'].sort(semver.sortVersions)
-    ).toEqual(['1.2.3-beta', '1.2.3', '1.3.4', '2.0.1']);
+      expect(
+        semver.getNewValue({
+          currentValue: '^5',
+          rangeStrategy: 'update-lockfile',
+          currentVersion: '5.1.0',
+          newVersion: '5.2.0',
+        })
+      ).toEqual('^5');
+      expect(
+        semver.getNewValue({
+          currentValue: '^5',
+          rangeStrategy: 'update-lockfile',
+          currentVersion: '5.1.0',
+          newVersion: '6.0.0',
+        })
+      ).toEqual('^6');
+    });
+  });
+  describe('.sortVersions', () => {
+    it('sorts versions in an ascending order', () => {
+      expect(
+        ['1.2.3-beta', '2.0.1', '1.3.4', '1.2.3'].sort(semver.sortVersions)
+      ).toEqual(['1.2.3-beta', '1.2.3', '1.3.4', '2.0.1']);
+    });
   });
 });
diff --git a/lib/versioning/docker/index.spec.ts b/lib/versioning/docker/index.spec.ts
index 06fbc4f0c9e32bdb6d76c530094e97384132cbec..c0248646e162e002b99a6e1361d8645b0c3af335 100644
--- a/lib/versioning/docker/index.spec.ts
+++ b/lib/versioning/docker/index.spec.ts
@@ -1,7 +1,7 @@
 import semver from '../semver';
 import docker from '.';
 
-describe('docker.', () => {
+describe('versioning/docker/index', () => {
   describe('isValid(version)', () => {
     it('should support all versions length', () => {
       expect(docker.isValid(null)).toBeNull();
diff --git a/lib/versioning/git/index.spec.ts b/lib/versioning/git/index.spec.ts
index 0929f4ceaacf98dd8df1c5088e4b195c1efe5e97..41d2a764cca376af0bbabc31203a938111514277 100644
--- a/lib/versioning/git/index.spec.ts
+++ b/lib/versioning/git/index.spec.ts
@@ -1,6 +1,6 @@
 import git from '.';
 
-describe('git.', () => {
+describe('versioning/git/index', () => {
   describe('isValid(version)', () => {
     it('should return true', () => {
       expect(git.isValid('a1')).toBeTruthy();
diff --git a/lib/versioning/gradle/index.spec.ts b/lib/versioning/gradle/index.spec.ts
index d6244ad03597de3c0e382922434ada2226dfc59f..1d8afc0eeb1beb4d12f73915f28569bd8d14507d 100644
--- a/lib/versioning/gradle/index.spec.ts
+++ b/lib/versioning/gradle/index.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../test/util';
 import { compare, parseMavenBasedRange, parsePrefixRange } from './compare';
 import { api } from '.';
 
-describe(getName(), () => {
+describe('versioning/gradle/index', () => {
   it('returns equality', () => {
     expect(compare('1', '1')).toEqual(0);
     expect(compare('a', 'a')).toEqual(0);
@@ -118,9 +117,7 @@ describe(getName(), () => {
       expect(range).toBeNull();
     });
   });
-});
 
-describe(getName(), () => {
   it('isValid', () => {
     expect(api.isValid('1.0.0')).toBe(true);
     expect(api.isValid('[1.12.6,1.18.6]')).toBe(true);
diff --git a/lib/versioning/hashicorp/index.spec.ts b/lib/versioning/hashicorp/index.spec.ts
index 52aac2ef2d0fc3844aa4aacb26427e8285606a00..b6e06d363924766111f3890400cd9d0f50aff308 100644
--- a/lib/versioning/hashicorp/index.spec.ts
+++ b/lib/versioning/hashicorp/index.spec.ts
@@ -1,123 +1,125 @@
 import { api as semver } from '.';
 
-describe('semver.matches()', () => {
-  it('handles tilde greater than', () => {
-    expect(semver.matches('4.2.0', '~> 4.0')).toBe(true);
-    expect(semver.matches('4.2.0', '~> 4.0.0')).toBe(false);
+describe('versioning/hashicorp/index', () => {
+  describe('semver.matches()', () => {
+    it('handles tilde greater than', () => {
+      expect(semver.matches('4.2.0', '~> 4.0')).toBe(true);
+      expect(semver.matches('4.2.0', '~> 4.0.0')).toBe(false);
+    });
   });
-});
-describe('semver.getSatisfyingVersion()', () => {
-  it('handles tilde greater than', () => {
-    expect(
-      semver.getSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
-        '~> 4.0'
-      )
-    ).toBe('4.2.0');
-    expect(
-      semver.getSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
-        '~> 4.0.0'
-      )
-    ).toBe('4.0.0');
-  });
-});
-describe('semver.isValid()', () => {
-  it('handles comma', () => {
-    expect(semver.isValid('>= 1.0.0, <= 2.0.0')).toBeTruthy();
+  describe('semver.getSatisfyingVersion()', () => {
+    it('handles tilde greater than', () => {
+      expect(
+        semver.getSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
+          '~> 4.0'
+        )
+      ).toBe('4.2.0');
+      expect(
+        semver.getSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
+          '~> 4.0.0'
+        )
+      ).toBe('4.0.0');
+    });
   });
-});
-describe('semver.isLessThanRange()', () => {
-  it('handles comma', () => {
-    expect(semver.isLessThanRange('0.9.0', '>= 1.0.0, <= 2.0.0')).toBe(true);
-    expect(semver.isLessThanRange('1.9.0', '>= 1.0.0, <= 2.0.0')).toBe(false);
+  describe('semver.isValid()', () => {
+    it('handles comma', () => {
+      expect(semver.isValid('>= 1.0.0, <= 2.0.0')).toBeTruthy();
+    });
   });
-});
-describe('semver.minSatisfyingVersion()', () => {
-  it('handles tilde greater than', () => {
-    expect(
-      semver.minSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
-        '~> 4.0'
-      )
-    ).toBe('4.2.0');
-    expect(
-      semver.minSatisfyingVersion(
-        ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
-        '~> 4.0.0'
-      )
-    ).toBeNull();
-  });
-});
-describe('semver.getNewValue()', () => {
-  it('handles tilde greater than', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~> 1.2',
-        rangeStrategy: 'replace',
-        currentVersion: '1.2.3',
-        newVersion: '2.0.7',
-      })
-    ).toEqual('~> 2.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~> 1.2.0',
-        rangeStrategy: 'replace',
-        currentVersion: '1.2.3',
-        newVersion: '2.0.7',
-      })
-    ).toEqual('~> 2.0.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~> 0.14.0',
-        rangeStrategy: 'replace',
-        currentVersion: '0.14.1',
-        newVersion: '0.15.0',
-      })
-    ).toEqual('~> 0.15.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~> 0.14.0',
-        rangeStrategy: 'replace',
-        currentVersion: '0.14.1',
-        newVersion: '0.15.1',
-      })
-    ).toEqual('~> 0.15.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '~> 0.14.6',
-        rangeStrategy: 'replace',
-        currentVersion: '0.14.6',
-        newVersion: '0.15.0',
-      })
-    ).toEqual('~> 0.15.0');
+  describe('semver.isLessThanRange()', () => {
+    it('handles comma', () => {
+      expect(semver.isLessThanRange('0.9.0', '>= 1.0.0, <= 2.0.0')).toBe(true);
+      expect(semver.isLessThanRange('1.9.0', '>= 1.0.0, <= 2.0.0')).toBe(false);
+    });
   });
-  it('handles comma dividers', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 1.0.0, <= 2.0.0',
-        rangeStrategy: 'widen',
-        currentVersion: '1.2.3',
-        newVersion: '2.0.7',
-      })
-    ).toEqual('>= 1.0.0, <= 2.0.7');
+  describe('semver.minSatisfyingVersion()', () => {
+    it('handles tilde greater than', () => {
+      expect(
+        semver.minSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
+          '~> 4.0'
+        )
+      ).toBe('4.2.0');
+      expect(
+        semver.minSatisfyingVersion(
+          ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
+          '~> 4.0.0'
+        )
+      ).toBeNull();
+    });
   });
-  it('updates short ranges', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '0.14',
-        rangeStrategy: 'replace',
-        currentVersion: '0.14.2',
-        newVersion: '0.15.0',
-      })
-    ).toEqual('0.15');
-    expect(
-      semver.getNewValue({
-        currentValue: '~> 0.14',
-        rangeStrategy: 'replace',
-        currentVersion: '0.14.2',
-        newVersion: '0.15.0',
-      })
-    ).toEqual('~> 0.15');
+  describe('semver.getNewValue()', () => {
+    it('handles tilde greater than', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~> 1.2',
+          rangeStrategy: 'replace',
+          currentVersion: '1.2.3',
+          newVersion: '2.0.7',
+        })
+      ).toEqual('~> 2.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~> 1.2.0',
+          rangeStrategy: 'replace',
+          currentVersion: '1.2.3',
+          newVersion: '2.0.7',
+        })
+      ).toEqual('~> 2.0.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~> 0.14.0',
+          rangeStrategy: 'replace',
+          currentVersion: '0.14.1',
+          newVersion: '0.15.0',
+        })
+      ).toEqual('~> 0.15.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~> 0.14.0',
+          rangeStrategy: 'replace',
+          currentVersion: '0.14.1',
+          newVersion: '0.15.1',
+        })
+      ).toEqual('~> 0.15.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '~> 0.14.6',
+          rangeStrategy: 'replace',
+          currentVersion: '0.14.6',
+          newVersion: '0.15.0',
+        })
+      ).toEqual('~> 0.15.0');
+    });
+    it('handles comma dividers', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 1.0.0, <= 2.0.0',
+          rangeStrategy: 'widen',
+          currentVersion: '1.2.3',
+          newVersion: '2.0.7',
+        })
+      ).toEqual('>= 1.0.0, <= 2.0.7');
+    });
+    it('updates short ranges', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '0.14',
+          rangeStrategy: 'replace',
+          currentVersion: '0.14.2',
+          newVersion: '0.15.0',
+        })
+      ).toEqual('0.15');
+      expect(
+        semver.getNewValue({
+          currentValue: '~> 0.14',
+          rangeStrategy: 'replace',
+          currentVersion: '0.14.2',
+          newVersion: '0.15.0',
+        })
+      ).toEqual('~> 0.15');
+    });
   });
 });
diff --git a/lib/versioning/hex/index.spec.ts b/lib/versioning/hex/index.spec.ts
index a4e219d6e0e125c4c164a15b896f7f9c54ba7097..4388e001985ea376cd2c10ead366968f3f766197 100644
--- a/lib/versioning/hex/index.spec.ts
+++ b/lib/versioning/hex/index.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { api as hexScheme } from '.';
 
-describe(getName(), () => {
+describe('versioning/hex/index', () => {
   describe('hexScheme.matches()', () => {
     it('handles tilde greater than', () => {
       expect(hexScheme.matches('4.2.0', '~> 4.0')).toBe(true);
diff --git a/lib/versioning/index.spec.ts b/lib/versioning/index.spec.ts
index 5b65cb507df1d38f52fa8bcc58299a0b2fe2e38e..9de3bba101e97444856d6eb2e2eff55a110021d8 100644
--- a/lib/versioning/index.spec.ts
+++ b/lib/versioning/index.spec.ts
@@ -10,7 +10,7 @@ const supportedSchemes = getOptions().find(
   (option) => option.name === 'versioning'
 ).allowedValues;
 
-describe('allVersioning.get(versioning)', () => {
+describe('versioning/index', () => {
   it('has api', () => {
     // FIXME: explicit assert condition
     expect(Object.keys(allVersioning.get('semver')).sort()).toMatchSnapshot();
diff --git a/lib/versioning/ivy/index.spec.ts b/lib/versioning/ivy/index.spec.ts
index 57bbee555848c77e43f1161a9222273aae0c79e8..de14e05257f89d27bd9ca90246625f9c2d51097c 100644
--- a/lib/versioning/ivy/index.spec.ts
+++ b/lib/versioning/ivy/index.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import {
   REV_TYPE_LATEST,
   REV_TYPE_RANGE,
@@ -9,7 +8,7 @@ import ivy from '.';
 
 const { getNewValue, isValid, isVersion, matches } = ivy;
 
-describe(getName(), () => {
+describe('versioning/ivy/index', () => {
   it('parses dynamic revisions', () => {
     expect(parseDynamicRevision(null)).toBeNull();
     expect(parseDynamicRevision('')).toBeNull();
@@ -59,9 +58,7 @@ describe(getName(), () => {
 
     expect(parseDynamicRevision('[0,1),(1,)')).toBeNull();
   });
-});
 
-describe(getName(), () => {
   it('isValid', () => {
     expect(isValid('')).toBe(false);
     expect(isValid('1.0.0')).toBe(true);
diff --git a/lib/versioning/loose/__snapshots__/index.spec.ts.snap b/lib/versioning/loose/__snapshots__/index.spec.ts.snap
index 197f6bb52e49b9fd3ddde23d1075992639502f46..54c1f1d20bccee77d73c0380d7483c58ff52764a 100644
--- a/lib/versioning/loose/__snapshots__/index.spec.ts.snap
+++ b/lib/versioning/loose/__snapshots__/index.spec.ts.snap
@@ -1,7 +1,7 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`loose. isVersion 1.1 1`] = `"1.1"`;
+exports[`versioning/loose/index isVersion 1.1 1`] = `"1.1"`;
 
-exports[`loose. isVersion 1.3.RC2 1`] = `"1.3.RC2"`;
+exports[`versioning/loose/index isVersion 1.3.RC2 1`] = `"1.3.RC2"`;
 
-exports[`loose. isVersion 2.1-rc2 1`] = `"2.1-rc2"`;
+exports[`versioning/loose/index isVersion 2.1-rc2 1`] = `"2.1-rc2"`;
diff --git a/lib/versioning/loose/index.spec.ts b/lib/versioning/loose/index.spec.ts
index 3983cda500609fad5fd26a696277f827a34d34e0..62d5bd1c4adc8a8bb9ccd1a472fba6f1ba8b081f 100644
--- a/lib/versioning/loose/index.spec.ts
+++ b/lib/versioning/loose/index.spec.ts
@@ -1,6 +1,6 @@
 import loose from '.';
 
-describe('loose.', () => {
+describe('versioning/loose/index', () => {
   describe('isVersion', () => {
     ['1.1', '1.3.RC2', '2.1-rc2'].forEach((version) => {
       it(version, () => {
diff --git a/lib/versioning/loose/utils.spec.ts b/lib/versioning/loose/utils.spec.ts
index 880e3ee8c10196ec11f0647047ac2f995a19cf2f..91b33aec2a5d39ee1dd8e2835de936215244acfb 100644
--- a/lib/versioning/loose/utils.spec.ts
+++ b/lib/versioning/loose/utils.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { GenericVersion, GenericVersioningApi } from './generic';
 
-describe(getName(), () => {
+describe('versioning/loose/utils', () => {
   const optionalFunctions = [
     'isLessThanRange',
     'valueToVersion',
diff --git a/lib/versioning/maven/index.spec.ts b/lib/versioning/maven/index.spec.ts
index 8ca9826afa855710e47be217a56be02a7abd7869..4f2e0a0be7572da53408847061021e59f9aa06a1 100644
--- a/lib/versioning/maven/index.spec.ts
+++ b/lib/versioning/maven/index.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import {
   autoExtendMavenRange,
   compare,
@@ -18,7 +17,7 @@ const {
   getNewValue,
 } = maven;
 
-describe(getName(), () => {
+describe('versioning/maven/index', () => {
   it('returns equality', () => {
     expect(compare('1.0.0', '1')).toEqual(0);
     expect(compare('1-a1', '1-alpha-1')).toEqual(0);
@@ -295,9 +294,7 @@ describe(getName(), () => {
       expect(autoExtendMavenRange(oldRepr, newValue)).toEqual(newRepr);
     });
   });
-});
 
-describe(getName(), () => {
   it('returns valid', () => {
     expect(isValid('1.0.0')).toBe(true);
     expect(isValid('[1.12.6,1.18.6]')).toBe(true);
diff --git a/lib/versioning/node/index.spec.ts b/lib/versioning/node/index.spec.ts
index 7577e009d8b6dae612b8a289a441395d56ee5498..05ed63c55562e19dd86c76f0b2b24747da25ba74 100644
--- a/lib/versioning/node/index.spec.ts
+++ b/lib/versioning/node/index.spec.ts
@@ -1,7 +1,7 @@
 import { DateTime } from 'luxon';
 import { isStable, isValid, api as nodever } from '.';
 
-describe('semver.getNewValue()', () => {
+describe('versioning/node/index', () => {
   let dtLocal: any;
   beforeEach(() => {
     dtLocal = DateTime.local;
diff --git a/lib/versioning/npm/index.spec.ts b/lib/versioning/npm/index.spec.ts
index 73e5f5bd00a3a55e28252ae490eaba58d5f70e46..bc2f51a317b4467ab6facaba219b9eb4a4bb9818 100644
--- a/lib/versioning/npm/index.spec.ts
+++ b/lib/versioning/npm/index.spec.ts
@@ -1,362 +1,364 @@
 import { api as semver } from '.';
 
-describe('semver.isValid(input)', () => {
-  it('should return null for irregular versions', () => {
-    expect(semver.isValid('17.04.0')).toBeFalsy();
-  });
-  it('should support simple semver', () => {
-    expect(semver.isValid('1.2.3')).toBeTruthy();
-  });
-  it('should support semver with dash', () => {
-    expect(semver.isValid('1.2.3-foo')).toBeTruthy();
-  });
-  it('should reject semver without dash', () => {
-    expect(semver.isValid('1.2.3foo')).toBeFalsy();
-  });
-  it('should support ranges', () => {
-    expect(semver.isValid('~1.2.3')).toBeTruthy();
-    expect(semver.isValid('^1.2.3')).toBeTruthy();
-    expect(semver.isValid('>1.2.3')).toBeTruthy();
-  });
-  it('should reject github repositories', () => {
-    expect(semver.isValid('renovatebot/renovate')).toBeFalsy();
-    expect(semver.isValid('renovatebot/renovate#master')).toBeFalsy();
-    expect(
-      semver.isValid('https://github.com/renovatebot/renovate.git')
-    ).toBeFalsy();
-  });
-});
-describe('semver.isSingleVersion()', () => {
-  it('returns true if naked version', () => {
-    expect(semver.isSingleVersion('1.2.3')).toBeTruthy();
-    expect(semver.isSingleVersion('1.2.3-alpha.1')).toBeTruthy();
-  });
-  it('returns true if equals', () => {
-    expect(semver.isSingleVersion('=1.2.3')).toBeTruthy();
-    expect(semver.isSingleVersion('= 1.2.3')).toBeTruthy();
-  });
-  it('returns false when not version', () => {
-    expect(semver.isSingleVersion('1.x')).toBeFalsy();
-  });
-});
-describe('semver.getNewValue()', () => {
-  it('bumps equals', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '=1.0.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.0',
-      })
-    ).toEqual('=1.1.0');
-  });
-  it('bumps short caret to same', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.0.7',
-      })
-    ).toEqual('^1.0');
+describe('versioning/npm/index', () => {
+  describe('semver.isValid(input)', () => {
+    it('should return null for irregular versions', () => {
+      expect(semver.isValid('17.04.0')).toBeFalsy();
+    });
+    it('should support simple semver', () => {
+      expect(semver.isValid('1.2.3')).toBeTruthy();
+    });
+    it('should support semver with dash', () => {
+      expect(semver.isValid('1.2.3-foo')).toBeTruthy();
+    });
+    it('should reject semver without dash', () => {
+      expect(semver.isValid('1.2.3foo')).toBeFalsy();
+    });
+    it('should support ranges', () => {
+      expect(semver.isValid('~1.2.3')).toBeTruthy();
+      expect(semver.isValid('^1.2.3')).toBeTruthy();
+      expect(semver.isValid('>1.2.3')).toBeTruthy();
+    });
+    it('should reject github repositories', () => {
+      expect(semver.isValid('renovatebot/renovate')).toBeFalsy();
+      expect(semver.isValid('renovatebot/renovate#master')).toBeFalsy();
+      expect(
+        semver.isValid('https://github.com/renovatebot/renovate.git')
+      ).toBeFalsy();
+    });
   });
-  it('bumps caret to prerelease', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.0.7-prerelease.1',
-      })
-    ).toEqual('^1.0.7-prerelease.1');
+  describe('semver.isSingleVersion()', () => {
+    it('returns true if naked version', () => {
+      expect(semver.isSingleVersion('1.2.3')).toBeTruthy();
+      expect(semver.isSingleVersion('1.2.3-alpha.1')).toBeTruthy();
+    });
+    it('returns true if equals', () => {
+      expect(semver.isSingleVersion('=1.2.3')).toBeTruthy();
+      expect(semver.isSingleVersion('= 1.2.3')).toBeTruthy();
+    });
+    it('returns false when not version', () => {
+      expect(semver.isSingleVersion('1.x')).toBeFalsy();
+    });
   });
-  it('replaces with newer', () => {
-    [
-      ['^0.0.3', '0.0.6', '^0.0.6'],
-      ['^0.0.3', '0.5.0', '^0.5.0'],
-      ['^0.0.3', '0.5.6', '^0.5.0'],
-      ['^0.0.3', '4.0.0', '^4.0.0'],
-      ['^0.0.3', '4.0.6', '^4.0.0'],
-      ['^0.0.3', '4.5.6', '^4.0.0'],
-      ['^0.2.0', '0.5.6', '^0.5.0'],
-      ['^0.2.3', '0.5.0', '^0.5.0'],
-      ['^0.2.3', '0.5.6', '^0.5.0'],
-      ['^1.2.3', '4.0.0', '^4.0.0'],
-      ['^1.2.3', '4.5.6', '^4.0.0'],
-      ['^1.0.0', '4.5.6', '^4.0.0'],
+  describe('semver.getNewValue()', () => {
+    it('bumps equals', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '=1.0.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.0',
+        })
+      ).toEqual('=1.1.0');
+    });
+    it('bumps short caret to same', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.0.7',
+        })
+      ).toEqual('^1.0');
+    });
+    it('bumps caret to prerelease', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.0.7-prerelease.1',
+        })
+      ).toEqual('^1.0.7-prerelease.1');
+    });
+    it('replaces with newer', () => {
+      [
+        ['^0.0.3', '0.0.6', '^0.0.6'],
+        ['^0.0.3', '0.5.0', '^0.5.0'],
+        ['^0.0.3', '0.5.6', '^0.5.0'],
+        ['^0.0.3', '4.0.0', '^4.0.0'],
+        ['^0.0.3', '4.0.6', '^4.0.0'],
+        ['^0.0.3', '4.5.6', '^4.0.0'],
+        ['^0.2.0', '0.5.6', '^0.5.0'],
+        ['^0.2.3', '0.5.0', '^0.5.0'],
+        ['^0.2.3', '0.5.6', '^0.5.0'],
+        ['^1.2.3', '4.0.0', '^4.0.0'],
+        ['^1.2.3', '4.5.6', '^4.0.0'],
+        ['^1.0.0', '4.5.6', '^4.0.0'],
 
-      ['^0.2.3', '0.2.4', '^0.2.3'],
-      ['^2.3.0', '2.4.0', '^2.3.0'],
-      ['^2.3.4', '2.4.5', '^2.3.4'],
-      ['^0.0.1', '0.0.2', '^0.0.2'],
-      ['^1.0.1', '2.0.2', '^2.0.0'],
-      ['^1.2.3', '1.2.3', '^1.2.3'],
-      ['^1.2.3', '1.2.2', '^1.2.2'],
+        ['^0.2.3', '0.2.4', '^0.2.3'],
+        ['^2.3.0', '2.4.0', '^2.3.0'],
+        ['^2.3.4', '2.4.5', '^2.3.4'],
+        ['^0.0.1', '0.0.2', '^0.0.2'],
+        ['^1.0.1', '2.0.2', '^2.0.0'],
+        ['^1.2.3', '1.2.3', '^1.2.3'],
+        ['^1.2.3', '1.2.2', '^1.2.2'],
 
-      ['^0.9.21', '0.9.22', '^0.9.21'], // #4762
-    ].forEach(([currentValue, newVersion, expectedValue]) => {
+        ['^0.9.21', '0.9.22', '^0.9.21'], // #4762
+      ].forEach(([currentValue, newVersion, expectedValue]) => {
+        expect(
+          semver.getNewValue({
+            currentValue,
+            rangeStrategy: 'replace',
+            currentVersion: currentValue.replace('^', ''),
+            newVersion,
+          })
+        ).toEqual(expectedValue);
+      });
+    });
+    it('supports tilde greater than', () => {
       expect(
         semver.getNewValue({
-          currentValue,
+          currentValue: '~> 1.0.0',
           rangeStrategy: 'replace',
-          currentVersion: currentValue.replace('^', ''),
-          newVersion,
+          currentVersion: '1.0.0',
+          newVersion: '1.1.7',
         })
-      ).toEqual(expectedValue);
+      ).toEqual('~> 1.1.0');
+    });
+    it('bumps short caret to new', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.7',
+        })
+      ).toEqual('^1.1');
+    });
+    it('bumps short tilde', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.7',
+        })
+      ).toEqual('~1.1');
+    });
+    it('bumps tilde to prerelease', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~1.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.0.7-prerelease.1',
+        })
+      ).toEqual('~1.0.7-prerelease.1');
+    });
+    it('updates naked caret', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '^1',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '2.1.7',
+        })
+      ).toEqual('^2');
+    });
+    it('bumps naked tilde', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~1',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.7',
+        })
+      ).toEqual('~1');
+    });
+    it('bumps naked major', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '5',
+          rangeStrategy: 'bump',
+          currentVersion: '5.0.0',
+          newVersion: '5.1.7',
+        })
+      ).toEqual('5');
+      expect(
+        semver.getNewValue({
+          currentValue: '5',
+          rangeStrategy: 'bump',
+          currentVersion: '5.0.0',
+          newVersion: '6.1.7',
+        })
+      ).toEqual('6');
+    });
+    it('bumps naked minor', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '5.0',
+          rangeStrategy: 'bump',
+          currentVersion: '5.0.0',
+          newVersion: '5.0.7',
+        })
+      ).toEqual('5.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '5.0',
+          rangeStrategy: 'bump',
+          currentVersion: '5.0.0',
+          newVersion: '5.1.7',
+        })
+      ).toEqual('5.1');
+      expect(
+        semver.getNewValue({
+          currentValue: '5.0',
+          rangeStrategy: 'bump',
+          currentVersion: '5.0.0',
+          newVersion: '6.1.7',
+        })
+      ).toEqual('6.1');
+    });
+    it('bumps greater or equals', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '>=1.0.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.0',
+        })
+      ).toEqual('>=1.1.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 1.0.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.0',
+        })
+      ).toEqual('>= 1.1.0');
+    });
+    it('replaces equals', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '=1.0.0',
+          rangeStrategy: 'replace',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.0',
+        })
+      ).toEqual('=1.1.0');
+    });
+    it('handles long asterisk', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '1.0.*',
+          rangeStrategy: 'replace',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.0',
+        })
+      ).toEqual('1.1.*');
+    });
+    it('handles short asterisk', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '1.*',
+          rangeStrategy: 'replace',
+          currentVersion: '1.0.0',
+          newVersion: '2.1.0',
+        })
+      ).toEqual('2.*');
+    });
+    it('handles updating from stable to unstable', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '~0.6.1',
+          rangeStrategy: 'replace',
+          currentVersion: '0.6.8',
+          newVersion: '0.7.0-rc.2',
+        })
+      ).toEqual('~0.7.0-rc');
+    });
+    it('bumps complex ranges', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 0.1.21 < 0.2.0',
+          rangeStrategy: 'bump',
+          currentVersion: '0.1.21',
+          newVersion: '0.1.24',
+        })
+      ).toEqual('>= 0.1.24 < 0.2.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 0.1.21 <= 0.2.0',
+          rangeStrategy: 'bump',
+          currentVersion: '0.1.21',
+          newVersion: '0.1.24',
+        })
+      ).toEqual('>= 0.1.24 <= 0.2.0');
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 0.0.1 <= 0.1',
+          rangeStrategy: 'bump',
+          currentVersion: '0.0.1',
+          newVersion: '0.0.2',
+        })
+      ).toEqual('>= 0.0.2 <= 0.1');
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 0.0.1 < 0.1',
+          rangeStrategy: 'bump',
+          currentVersion: '0.1.0',
+          newVersion: '0.2.1',
+        })
+      ).toEqual('>= 0.2.1 < 0.3');
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 0.0.1 < 0.0.4',
+          rangeStrategy: 'bump',
+          currentVersion: '0.0.4',
+          newVersion: '0.0.5',
+        })
+      ).toEqual('>= 0.0.5 < 0.0.6');
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 0.0.1 < 1',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.0.1',
+        })
+      ).toEqual('>= 1.0.1 < 2');
+      expect(
+        semver.getNewValue({
+          currentValue: '>= 0.0.1 < 1',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.0.1',
+        })
+      ).toEqual('>= 1.0.1 < 2');
+    });
+    it('widens', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '<=1.2.3',
+          rangeStrategy: 'widen',
+          currentVersion: '1.0.0',
+          newVersion: '1.2.3',
+        })
+      ).toEqual('<=1.2.3');
+      expect(
+        semver.getNewValue({
+          currentValue: '<=1.2.3',
+          rangeStrategy: 'widen',
+          currentVersion: '1.0.0',
+          newVersion: '1.2.4',
+        })
+      ).toEqual('<=1.2.4');
+      expect(
+        semver.getNewValue({
+          currentValue: '>=1.2.3',
+          rangeStrategy: 'widen',
+          currentVersion: '1.0.0',
+          newVersion: '1.2.3',
+        })
+      ).toEqual('>=1.2.3');
+      expect(
+        semver.getNewValue({
+          currentValue: '>=1.2.3',
+          rangeStrategy: 'widen',
+          currentVersion: '1.0.0',
+          newVersion: '1.2.1',
+        })
+      ).toEqual('>=1.2.3 || 1.2.1');
     });
-  });
-  it('supports tilde greater than', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~> 1.0.0',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.7',
-      })
-    ).toEqual('~> 1.1.0');
-  });
-  it('bumps short caret to new', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.7',
-      })
-    ).toEqual('^1.1');
-  });
-  it('bumps short tilde', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.7',
-      })
-    ).toEqual('~1.1');
-  });
-  it('bumps tilde to prerelease', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~1.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.0.7-prerelease.1',
-      })
-    ).toEqual('~1.0.7-prerelease.1');
-  });
-  it('updates naked caret', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '^1',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '2.1.7',
-      })
-    ).toEqual('^2');
-  });
-  it('bumps naked tilde', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~1',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.7',
-      })
-    ).toEqual('~1');
-  });
-  it('bumps naked major', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '5',
-        rangeStrategy: 'bump',
-        currentVersion: '5.0.0',
-        newVersion: '5.1.7',
-      })
-    ).toEqual('5');
-    expect(
-      semver.getNewValue({
-        currentValue: '5',
-        rangeStrategy: 'bump',
-        currentVersion: '5.0.0',
-        newVersion: '6.1.7',
-      })
-    ).toEqual('6');
-  });
-  it('bumps naked minor', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '5.0',
-        rangeStrategy: 'bump',
-        currentVersion: '5.0.0',
-        newVersion: '5.0.7',
-      })
-    ).toEqual('5.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '5.0',
-        rangeStrategy: 'bump',
-        currentVersion: '5.0.0',
-        newVersion: '5.1.7',
-      })
-    ).toEqual('5.1');
-    expect(
-      semver.getNewValue({
-        currentValue: '5.0',
-        rangeStrategy: 'bump',
-        currentVersion: '5.0.0',
-        newVersion: '6.1.7',
-      })
-    ).toEqual('6.1');
-  });
-  it('bumps greater or equals', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '>=1.0.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.0',
-      })
-    ).toEqual('>=1.1.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 1.0.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.0',
-      })
-    ).toEqual('>= 1.1.0');
-  });
-  it('replaces equals', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '=1.0.0',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.0',
-      })
-    ).toEqual('=1.1.0');
-  });
-  it('handles long asterisk', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '1.0.*',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.0',
-      })
-    ).toEqual('1.1.*');
-  });
-  it('handles short asterisk', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '1.*',
-        rangeStrategy: 'replace',
-        currentVersion: '1.0.0',
-        newVersion: '2.1.0',
-      })
-    ).toEqual('2.*');
-  });
-  it('handles updating from stable to unstable', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '~0.6.1',
-        rangeStrategy: 'replace',
-        currentVersion: '0.6.8',
-        newVersion: '0.7.0-rc.2',
-      })
-    ).toEqual('~0.7.0-rc');
-  });
-  it('bumps complex ranges', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 0.1.21 < 0.2.0',
-        rangeStrategy: 'bump',
-        currentVersion: '0.1.21',
-        newVersion: '0.1.24',
-      })
-    ).toEqual('>= 0.1.24 < 0.2.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 0.1.21 <= 0.2.0',
-        rangeStrategy: 'bump',
-        currentVersion: '0.1.21',
-        newVersion: '0.1.24',
-      })
-    ).toEqual('>= 0.1.24 <= 0.2.0');
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 0.0.1 <= 0.1',
-        rangeStrategy: 'bump',
-        currentVersion: '0.0.1',
-        newVersion: '0.0.2',
-      })
-    ).toEqual('>= 0.0.2 <= 0.1');
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 0.0.1 < 0.1',
-        rangeStrategy: 'bump',
-        currentVersion: '0.1.0',
-        newVersion: '0.2.1',
-      })
-    ).toEqual('>= 0.2.1 < 0.3');
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 0.0.1 < 0.0.4',
-        rangeStrategy: 'bump',
-        currentVersion: '0.0.4',
-        newVersion: '0.0.5',
-      })
-    ).toEqual('>= 0.0.5 < 0.0.6');
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 0.0.1 < 1',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.0.1',
-      })
-    ).toEqual('>= 1.0.1 < 2');
-    expect(
-      semver.getNewValue({
-        currentValue: '>= 0.0.1 < 1',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.0.1',
-      })
-    ).toEqual('>= 1.0.1 < 2');
-  });
-  it('widens', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '<=1.2.3',
-        rangeStrategy: 'widen',
-        currentVersion: '1.0.0',
-        newVersion: '1.2.3',
-      })
-    ).toEqual('<=1.2.3');
-    expect(
-      semver.getNewValue({
-        currentValue: '<=1.2.3',
-        rangeStrategy: 'widen',
-        currentVersion: '1.0.0',
-        newVersion: '1.2.4',
-      })
-    ).toEqual('<=1.2.4');
-    expect(
-      semver.getNewValue({
-        currentValue: '>=1.2.3',
-        rangeStrategy: 'widen',
-        currentVersion: '1.0.0',
-        newVersion: '1.2.3',
-      })
-    ).toEqual('>=1.2.3');
-    expect(
-      semver.getNewValue({
-        currentValue: '>=1.2.3',
-        rangeStrategy: 'widen',
-        currentVersion: '1.0.0',
-        newVersion: '1.2.1',
-      })
-    ).toEqual('>=1.2.3 || 1.2.1');
   });
 });
diff --git a/lib/versioning/nuget/__snapshots__/index.spec.ts.snap b/lib/versioning/nuget/__snapshots__/index.spec.ts.snap
index a78168333d27a77a32c62b302816a6fd2a974678..ee47b718625bb2dda29683287f66f7f196fb5dd1 100644
--- a/lib/versioning/nuget/__snapshots__/index.spec.ts.snap
+++ b/lib/versioning/nuget/__snapshots__/index.spec.ts.snap
@@ -1,49 +1,49 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`nuget. isStable 1.0.0+c30d7625 1`] = `true`;
+exports[`versioning/nuget/index isStable 1.0.0+c30d7625 1`] = `true`;
 
-exports[`nuget. isStable 1.2019.3.22 1`] = `true`;
+exports[`versioning/nuget/index isStable 1.2019.3.22 1`] = `true`;
 
-exports[`nuget. isStable 2.0.2-pre20191018090318 1`] = `false`;
+exports[`versioning/nuget/index isStable 2.0.2-pre20191018090318 1`] = `false`;
 
-exports[`nuget. isStable 2.3.4-beta+1990ef74 1`] = `false`;
+exports[`versioning/nuget/index isStable 2.3.4-beta+1990ef74 1`] = `false`;
 
-exports[`nuget. isStable 3.0.0-beta 1`] = `false`;
+exports[`versioning/nuget/index isStable 3.0.0-beta 1`] = `false`;
 
-exports[`nuget. isStable 9.0.3 1`] = `true`;
+exports[`versioning/nuget/index isStable 9.0.3 1`] = `true`;
 
-exports[`nuget. isVersion and isValid 1.0.0+c30d7625 1`] = `"1.0.0+c30d7625"`;
+exports[`versioning/nuget/index isVersion and isValid 1.0.0+c30d7625 1`] = `"1.0.0+c30d7625"`;
 
-exports[`nuget. isVersion and isValid 1.0.0+c30d7625 2`] = `"1.0.0+c30d7625"`;
+exports[`versioning/nuget/index isVersion and isValid 1.0.0+c30d7625 2`] = `"1.0.0+c30d7625"`;
 
-exports[`nuget. isVersion and isValid 1.2019.3.22 1`] = `"1.2019.3.22"`;
+exports[`versioning/nuget/index isVersion and isValid 1.2019.3.22 1`] = `"1.2019.3.22"`;
 
-exports[`nuget. isVersion and isValid 1.2019.3.22 2`] = `"1.2019.3.22"`;
+exports[`versioning/nuget/index isVersion and isValid 1.2019.3.22 2`] = `"1.2019.3.22"`;
 
-exports[`nuget. isVersion and isValid 2.0.2-pre20191018090318 1`] = `"2.0.2-pre20191018090318"`;
+exports[`versioning/nuget/index isVersion and isValid 2.0.2-pre20191018090318 1`] = `"2.0.2-pre20191018090318"`;
 
-exports[`nuget. isVersion and isValid 2.0.2-pre20191018090318 2`] = `"2.0.2-pre20191018090318"`;
+exports[`versioning/nuget/index isVersion and isValid 2.0.2-pre20191018090318 2`] = `"2.0.2-pre20191018090318"`;
 
-exports[`nuget. isVersion and isValid 2.3.4-beta+1990ef74 1`] = `"2.3.4-beta+1990ef74"`;
+exports[`versioning/nuget/index isVersion and isValid 2.3.4-beta+1990ef74 1`] = `"2.3.4-beta+1990ef74"`;
 
-exports[`nuget. isVersion and isValid 2.3.4-beta+1990ef74 2`] = `"2.3.4-beta+1990ef74"`;
+exports[`versioning/nuget/index isVersion and isValid 2.3.4-beta+1990ef74 2`] = `"2.3.4-beta+1990ef74"`;
 
-exports[`nuget. isVersion and isValid 3.0.0.beta 1`] = `null`;
+exports[`versioning/nuget/index isVersion and isValid 3.0.0.beta 1`] = `null`;
 
-exports[`nuget. isVersion and isValid 3.0.0.beta 2`] = `null`;
+exports[`versioning/nuget/index isVersion and isValid 3.0.0.beta 2`] = `null`;
 
-exports[`nuget. isVersion and isValid 3.0.0-beta 1`] = `"3.0.0-beta"`;
+exports[`versioning/nuget/index isVersion and isValid 3.0.0-beta 1`] = `"3.0.0-beta"`;
 
-exports[`nuget. isVersion and isValid 3.0.0-beta 2`] = `"3.0.0-beta"`;
+exports[`versioning/nuget/index isVersion and isValid 3.0.0-beta 2`] = `"3.0.0-beta"`;
 
-exports[`nuget. isVersion and isValid 5.1.2-+ 1`] = `null`;
+exports[`versioning/nuget/index isVersion and isValid 5.1.2-+ 1`] = `null`;
 
-exports[`nuget. isVersion and isValid 5.1.2-+ 2`] = `null`;
+exports[`versioning/nuget/index isVersion and isValid 5.1.2-+ 2`] = `null`;
 
-exports[`nuget. isVersion and isValid 9.0.3 1`] = `"9.0.3"`;
+exports[`versioning/nuget/index isVersion and isValid 9.0.3 1`] = `"9.0.3"`;
 
-exports[`nuget. isVersion and isValid 9.0.3 2`] = `"9.0.3"`;
+exports[`versioning/nuget/index isVersion and isValid 9.0.3 2`] = `"9.0.3"`;
 
-exports[`nuget. isVersion and isValid 17.04 1`] = `"17.04"`;
+exports[`versioning/nuget/index isVersion and isValid 17.04 1`] = `"17.04"`;
 
-exports[`nuget. isVersion and isValid 17.04 2`] = `"17.04"`;
+exports[`versioning/nuget/index isVersion and isValid 17.04 2`] = `"17.04"`;
diff --git a/lib/versioning/nuget/index.spec.ts b/lib/versioning/nuget/index.spec.ts
index 1fd0798dbf29b89cde4748d49aa373bfa5a87432..c2f6bd2a39a403df323c028f5f3f0aa1de137a1b 100644
--- a/lib/versioning/nuget/index.spec.ts
+++ b/lib/versioning/nuget/index.spec.ts
@@ -1,6 +1,6 @@
 import nuget from '.';
 
-describe('nuget.', () => {
+describe('versioning/nuget/index', () => {
   describe('isVersion and isValid', () => {
     [
       '9.0.3',
diff --git a/lib/versioning/pep440/index.spec.ts b/lib/versioning/pep440/index.spec.ts
index 7e40db69c7cfabe433cadc725512c27e217d5302..211c287b546d40f294e04fe830b788251fa732f3 100644
--- a/lib/versioning/pep440/index.spec.ts
+++ b/lib/versioning/pep440/index.spec.ts
@@ -1,215 +1,217 @@
 import pep440 from '.';
 
-describe('pep440.isValid(input)', () => {
-  it('should support a version without equals', () => {
-    expect(pep440.isValid('0.750')).toBeTruthy();
-    expect(pep440.isValid('1.2.3')).toBeTruthy();
-    expect(pep440.isValid('1.9')).toBeTruthy();
-  });
-  it('should support irregular versions', () => {
-    expect(pep440.isValid('17.04.0')).toBeTruthy();
-  });
-  it('should support simple pep440', () => {
-    expect(pep440.isValid('==1.2.3')).toBeTruthy();
-  });
-  it('should support pep440 with RC', () => {
-    expect(pep440.isValid('==1.2.3rc0')).toBeTruthy();
-  });
-  it('should support ranges', () => {
-    expect(pep440.isValid('~=1.2.3')).toBeTruthy();
-    expect(pep440.isValid('==1.2.*')).toBeTruthy();
-    expect(pep440.isValid('>1.2.3')).toBeTruthy();
-  });
-  it('should reject github repositories', () => {
-    expect(pep440.isValid('renovatebot/renovate')).toBeFalsy();
-    expect(pep440.isValid('renovatebot/renovate#master')).toBeFalsy();
-    expect(
-      pep440.isValid('https://github.com/renovatebot/renovate.git')
-    ).toBeFalsy();
+describe('versioning/pep440/index', () => {
+  describe('pep440.isValid(input)', () => {
+    it('should support a version without equals', () => {
+      expect(pep440.isValid('0.750')).toBeTruthy();
+      expect(pep440.isValid('1.2.3')).toBeTruthy();
+      expect(pep440.isValid('1.9')).toBeTruthy();
+    });
+    it('should support irregular versions', () => {
+      expect(pep440.isValid('17.04.0')).toBeTruthy();
+    });
+    it('should support simple pep440', () => {
+      expect(pep440.isValid('==1.2.3')).toBeTruthy();
+    });
+    it('should support pep440 with RC', () => {
+      expect(pep440.isValid('==1.2.3rc0')).toBeTruthy();
+    });
+    it('should support ranges', () => {
+      expect(pep440.isValid('~=1.2.3')).toBeTruthy();
+      expect(pep440.isValid('==1.2.*')).toBeTruthy();
+      expect(pep440.isValid('>1.2.3')).toBeTruthy();
+    });
+    it('should reject github repositories', () => {
+      expect(pep440.isValid('renovatebot/renovate')).toBeFalsy();
+      expect(pep440.isValid('renovatebot/renovate#master')).toBeFalsy();
+      expect(
+        pep440.isValid('https://github.com/renovatebot/renovate.git')
+      ).toBeFalsy();
+    });
   });
-});
 
-describe('pep440.isStable(version)', () => {
-  it('returns correct value', () => {
-    expect(pep440.isStable('1.2.3')).toBeTruthy();
-    expect(pep440.isStable('1.2.3rc0')).toBeFalsy();
-  });
-  it('returns false when version invalid', () => {
-    expect(pep440.isStable('not_version')).toBeFalsy();
+  describe('pep440.isStable(version)', () => {
+    it('returns correct value', () => {
+      expect(pep440.isStable('1.2.3')).toBeTruthy();
+      expect(pep440.isStable('1.2.3rc0')).toBeFalsy();
+    });
+    it('returns false when version invalid', () => {
+      expect(pep440.isStable('not_version')).toBeFalsy();
+    });
   });
-});
 
-describe('pep440.equals(version1, version2)', () => {
-  it('returns correct true', () => {
-    expect(pep440.equals('1.0', '1.0.0')).toBeTruthy();
-  });
-  it('returns false when version invalid', () => {
-    expect(pep440.equals('1.0.0', '1.0..foo')).toBeFalsy();
+  describe('pep440.equals(version1, version2)', () => {
+    it('returns correct true', () => {
+      expect(pep440.equals('1.0', '1.0.0')).toBeTruthy();
+    });
+    it('returns false when version invalid', () => {
+      expect(pep440.equals('1.0.0', '1.0..foo')).toBeFalsy();
+    });
   });
-});
 
-describe('pep440.isSingleVersion()', () => {
-  it('returns true if naked version', () => {
-    expect(pep440.isSingleVersion('1.2.3')).toBeTruthy();
-    expect(pep440.isSingleVersion('1.2.3rc0')).toBeTruthy();
-  });
-  it('returns true if double equals', () => {
-    expect(pep440.isSingleVersion('==1.2.3')).toBeTruthy();
-    expect(pep440.isSingleVersion('==1.2')).toBeTruthy();
-    expect(pep440.isSingleVersion('== 1.2.3')).toBeTruthy();
-  });
-  it('returns false when not version', () => {
-    expect(pep440.isSingleVersion('==1.*')).toBeFalsy();
+  describe('pep440.isSingleVersion()', () => {
+    it('returns true if naked version', () => {
+      expect(pep440.isSingleVersion('1.2.3')).toBeTruthy();
+      expect(pep440.isSingleVersion('1.2.3rc0')).toBeTruthy();
+    });
+    it('returns true if double equals', () => {
+      expect(pep440.isSingleVersion('==1.2.3')).toBeTruthy();
+      expect(pep440.isSingleVersion('==1.2')).toBeTruthy();
+      expect(pep440.isSingleVersion('== 1.2.3')).toBeTruthy();
+    });
+    it('returns false when not version', () => {
+      expect(pep440.isSingleVersion('==1.*')).toBeFalsy();
+    });
   });
-});
 
-const versions = [
-  '0.9.4',
-  '1.0.0',
-  '1.1.5',
-  '1.2.1',
-  '1.2.2',
-  '1.2.3',
-  '1.3.4',
-  '2.0.3',
-];
-
-describe('pep440.getSatisfyingVersion(versions, range)', () => {
-  it('returns correct value', () => {
-    expect(pep440.getSatisfyingVersion(versions, '~=1.2.1')).toBe('1.2.3');
-  });
-  it('returns null when none found', () => {
-    expect(pep440.getSatisfyingVersion(versions, '~=2.1')).toBeNull();
+  const versions = [
+    '0.9.4',
+    '1.0.0',
+    '1.1.5',
+    '1.2.1',
+    '1.2.2',
+    '1.2.3',
+    '1.3.4',
+    '2.0.3',
+  ];
+
+  describe('pep440.getSatisfyingVersion(versions, range)', () => {
+    it('returns correct value', () => {
+      expect(pep440.getSatisfyingVersion(versions, '~=1.2.1')).toBe('1.2.3');
+    });
+    it('returns null when none found', () => {
+      expect(pep440.getSatisfyingVersion(versions, '~=2.1')).toBeNull();
+    });
   });
-});
 
-describe('pep440.minSatisfyingVersion(versions, range)', () => {
-  it('returns correct value', () => {
-    expect(pep440.minSatisfyingVersion(versions, '~=1.2.1')).toBe('1.2.1');
-  });
-  it('returns null when none found', () => {
-    expect(pep440.minSatisfyingVersion(versions, '~=2.1')).toBeNull();
+  describe('pep440.minSatisfyingVersion(versions, range)', () => {
+    it('returns correct value', () => {
+      expect(pep440.minSatisfyingVersion(versions, '~=1.2.1')).toBe('1.2.1');
+    });
+    it('returns null when none found', () => {
+      expect(pep440.minSatisfyingVersion(versions, '~=2.1')).toBeNull();
+    });
   });
-});
 
-describe('pep440.getNewValue()', () => {
-  const { getNewValue } = pep440;
-
-  // cases: [currentValue, expectedBump]
-  [
-    // plain version
-    ['1.0.0', '1.2.3'],
-
-    // simple cases
-    ['==1.0.3', '==1.2.3'],
-    ['>=1.2.0', '>=1.2.3'],
-    ['~=1.2.0', '~=1.2.3'],
-    ['~=1.0.3', '~=1.2.3'],
-
-    // glob
-    ['==1.2.*', '==1.2.*'],
-    ['==1.0.*', '==1.2.*'],
-
-    // future versions guard
-    ['<1.2.2.3', '<1.2.4.0'],
-    ['<1.2.3', '<1.2.4'],
-    ['<1.2', '<1.3'],
-    ['<1', '<2'],
-    ['<2.0.0', '<2.0.0'],
-
-    // minimum version guard
-    ['>0.9.8', '>0.9.8'],
-    // rollback
-    ['>2.0.0', '>=1.2.3'],
-    ['>=2.0.0', '>=1.2.3'],
-
-    // complex ranges
-    ['~=1.1.0, !=1.1.1', '~=1.2.3, !=1.1.1'],
-    ['~=1.1.0,!=1.1.1', '~=1.2.3,!=1.1.1'],
-
-    // invalid & not supported
-    [' ', ' '],
-    ['invalid', null],
-    ['===1.0.3', null],
-    // impossible
-    ['!=1.2.3', null],
-  ].forEach(([currentValue, expectedBump]) => {
-    const bumped = getNewValue({
-      currentValue,
-      rangeStrategy: 'bump',
-      currentVersion: '1.0.0',
-      newVersion: '1.2.3',
-    });
-    it(`bumps '${currentValue}' to '${expectedBump}'`, () => {
-      expect(bumped).toBe(expectedBump);
-    });
-
-    const replaced = getNewValue({
-      currentValue,
-      rangeStrategy: 'replace',
-      currentVersion: '1.0.0',
-      newVersion: '1.2.3',
-    });
-    const needReplace = pep440.matches('1.2.3', currentValue);
-    const expectedReplace = needReplace ? currentValue : bumped;
-    it(`replaces '${currentValue}' to '${expectedReplace}'`, () => {
-      expect(replaced).toBe(expectedReplace);
-    });
-
-    const pinned = getNewValue({
-      currentValue,
-      rangeStrategy: 'pin',
-      currentVersion: '1.0.0',
-      newVersion: '1.2.3',
-    });
-    const expectedPin = '==1.2.3';
-    it(`pins '${currentValue}' to '${expectedPin}'`, () => {
-      expect(pinned).toBe(expectedPin);
+  describe('pep440.getNewValue()', () => {
+    const { getNewValue } = pep440;
+
+    // cases: [currentValue, expectedBump]
+    [
+      // plain version
+      ['1.0.0', '1.2.3'],
+
+      // simple cases
+      ['==1.0.3', '==1.2.3'],
+      ['>=1.2.0', '>=1.2.3'],
+      ['~=1.2.0', '~=1.2.3'],
+      ['~=1.0.3', '~=1.2.3'],
+
+      // glob
+      ['==1.2.*', '==1.2.*'],
+      ['==1.0.*', '==1.2.*'],
+
+      // future versions guard
+      ['<1.2.2.3', '<1.2.4.0'],
+      ['<1.2.3', '<1.2.4'],
+      ['<1.2', '<1.3'],
+      ['<1', '<2'],
+      ['<2.0.0', '<2.0.0'],
+
+      // minimum version guard
+      ['>0.9.8', '>0.9.8'],
+      // rollback
+      ['>2.0.0', '>=1.2.3'],
+      ['>=2.0.0', '>=1.2.3'],
+
+      // complex ranges
+      ['~=1.1.0, !=1.1.1', '~=1.2.3, !=1.1.1'],
+      ['~=1.1.0,!=1.1.1', '~=1.2.3,!=1.1.1'],
+
+      // invalid & not supported
+      [' ', ' '],
+      ['invalid', null],
+      ['===1.0.3', null],
+      // impossible
+      ['!=1.2.3', null],
+    ].forEach(([currentValue, expectedBump]) => {
+      const bumped = getNewValue({
+        currentValue,
+        rangeStrategy: 'bump',
+        currentVersion: '1.0.0',
+        newVersion: '1.2.3',
+      });
+      it(`bumps '${currentValue}' to '${expectedBump}'`, () => {
+        expect(bumped).toBe(expectedBump);
+      });
+
+      const replaced = getNewValue({
+        currentValue,
+        rangeStrategy: 'replace',
+        currentVersion: '1.0.0',
+        newVersion: '1.2.3',
+      });
+      const needReplace = pep440.matches('1.2.3', currentValue);
+      const expectedReplace = needReplace ? currentValue : bumped;
+      it(`replaces '${currentValue}' to '${expectedReplace}'`, () => {
+        expect(replaced).toBe(expectedReplace);
+      });
+
+      const pinned = getNewValue({
+        currentValue,
+        rangeStrategy: 'pin',
+        currentVersion: '1.0.0',
+        newVersion: '1.2.3',
+      });
+      const expectedPin = '==1.2.3';
+      it(`pins '${currentValue}' to '${expectedPin}'`, () => {
+        expect(pinned).toBe(expectedPin);
+      });
     });
-  });
 
-  it('guards against unsupported rangeStrategy', () => {
-    const invalid = getNewValue({
-      currentValue: '==1.0.0',
-      rangeStrategy: 'update-lockfile',
-      currentVersion: '1.0.0',
-      newVersion: '1.2.3',
+    it('guards against unsupported rangeStrategy', () => {
+      const invalid = getNewValue({
+        currentValue: '==1.0.0',
+        rangeStrategy: 'update-lockfile',
+        currentVersion: '1.0.0',
+        newVersion: '1.2.3',
+      });
+      expect(invalid).toEqual('==1.2.3');
     });
-    expect(invalid).toEqual('==1.2.3');
   });
-});
 
-describe('pep.isLessThanRange()', () => {
-  test.each([
-    ['>= 1.0.0, < 2.0.0', '0.9.9.9', true],
-    ['>= 1.0.0, < 2.0.0', '1.0.0a0', true],
-
-    ['> 1.0.0, < 2.0.0', '1.0.0.0', true],
-    ['> 1.0.0, < 2.0.0', '2.0.1.0', false],
-    ['> 1.0.0, < 2.0.0', '2.0.0.0', false],
-    ['> 1.0.0, < 2.0.0', '2.0.0a0', false],
-
-    ['== 1.2.3', '1.2.2.9', true],
-    ['== 1.2.3', '1.2.3a0', true],
-    ['== 1.2.3', '1.2.3.0', false],
-    ['== 1.2.3', '1.2.3.1', false],
-    ['== 1.2.3', '1.2.4a0', false],
-
-    ['!= 1.2.3', '1.2.2.9', false],
-    ['!= 1.2.3', '1.2.3.0', false],
-    ['!= 1.2.3', '1.2.3.1', false],
-
-    ['< 1.0.0', '0.0.1', false],
-    ['< 1.0.0', '1.0.0', false],
-    ['< 1.0.0', '2.0.0', false],
-
-    ['<= 1.0.0', '0.0.1', false],
-    ['<= 1.0.0', '1.0.0', false],
-    ['<= 1.0.0', '2.0.0', false],
-
-    ['< 1.0.0, > 2.0.0', '0.0.1', true], // fixme (maybe)
-    ['< 1.0.0, > 2.0.0', '3.0.0', false],
-  ])(`%s\t%s\t%s`, (range, version, expected) => {
-    expect(pep440.isLessThanRange(version, range)).toBe(expected);
+  describe('pep.isLessThanRange()', () => {
+    test.each([
+      ['>= 1.0.0, < 2.0.0', '0.9.9.9', true],
+      ['>= 1.0.0, < 2.0.0', '1.0.0a0', true],
+
+      ['> 1.0.0, < 2.0.0', '1.0.0.0', true],
+      ['> 1.0.0, < 2.0.0', '2.0.1.0', false],
+      ['> 1.0.0, < 2.0.0', '2.0.0.0', false],
+      ['> 1.0.0, < 2.0.0', '2.0.0a0', false],
+
+      ['== 1.2.3', '1.2.2.9', true],
+      ['== 1.2.3', '1.2.3a0', true],
+      ['== 1.2.3', '1.2.3.0', false],
+      ['== 1.2.3', '1.2.3.1', false],
+      ['== 1.2.3', '1.2.4a0', false],
+
+      ['!= 1.2.3', '1.2.2.9', false],
+      ['!= 1.2.3', '1.2.3.0', false],
+      ['!= 1.2.3', '1.2.3.1', false],
+
+      ['< 1.0.0', '0.0.1', false],
+      ['< 1.0.0', '1.0.0', false],
+      ['< 1.0.0', '2.0.0', false],
+
+      ['<= 1.0.0', '0.0.1', false],
+      ['<= 1.0.0', '1.0.0', false],
+      ['<= 1.0.0', '2.0.0', false],
+
+      ['< 1.0.0, > 2.0.0', '0.0.1', true], // fixme (maybe)
+      ['< 1.0.0, > 2.0.0', '3.0.0', false],
+    ])(`%s\t%s\t%s`, (range, version, expected) => {
+      expect(pep440.isLessThanRange(version, range)).toBe(expected);
+    });
   });
 });
diff --git a/lib/versioning/poetry/index.spec.ts b/lib/versioning/poetry/index.spec.ts
index f204ba153e65e5a14cd00c40d5d6d7d5cc66812c..3e702bc70c4195e44afa9e7ff603927cf36113d7 100644
--- a/lib/versioning/poetry/index.spec.ts
+++ b/lib/versioning/poetry/index.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { api as versionig } from '.';
 
-describe(getName(), () => {
+describe('versioning/poetry/index', () => {
   describe('equals', () => {
     it.each([
       ['1', '1'],
diff --git a/lib/versioning/regex/index.spec.ts b/lib/versioning/regex/index.spec.ts
index 09c57ac1d3360a6be5f43811f2944d378f641583..b2cd786512ff1485bf44b0da840ea915767af1f3 100644
--- a/lib/versioning/regex/index.spec.ts
+++ b/lib/versioning/regex/index.spec.ts
@@ -1,7 +1,7 @@
 import { VersioningApi, get } from '..';
 import { CONFIG_VALIDATION } from '../../constants/error-messages';
 
-describe('regex', () => {
+describe('versioning/regex/index', () => {
   const regex: VersioningApi = get(
     'regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?<prerelease>[^.-]+)?(?:-(?<compatibility>.*))?$'
   );
diff --git a/lib/versioning/ruby/__snapshots__/index.spec.ts.snap b/lib/versioning/ruby/__snapshots__/index.spec.ts.snap
index b29379aaf5006fb454da0afffad089e5449f84ce..ff84a3d593a27f1cf58b3d223ff4188dfe89d3f6 100644
--- a/lib/versioning/ruby/__snapshots__/index.spec.ts.snap
+++ b/lib/versioning/ruby/__snapshots__/index.spec.ts.snap
@@ -1,3 +1,3 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`semverRuby .getNewValue does not error 1`] = `">= 3.2, < 6.0.2"`;
+exports[`versioning/ruby/index .getNewValue does not error 1`] = `">= 3.2, < 6.0.2"`;
diff --git a/lib/versioning/ruby/index.spec.ts b/lib/versioning/ruby/index.spec.ts
index 08af7c5bb40405b36256fed15aa1d271db730c41..ed0cfb358e739cd9ed2fe079e7480ac0513dccfa 100644
--- a/lib/versioning/ruby/index.spec.ts
+++ b/lib/versioning/ruby/index.spec.ts
@@ -1,7 +1,7 @@
 import type { RangeStrategy } from '../../types';
 import { api as semverRuby } from '.';
 
-describe('semverRuby', () => {
+describe('versioning/ruby/index', () => {
   describe('.equals', () => {
     it('returns true when versions are equal', () => {
       expect(semverRuby.equals('1.0.0', '1')).toBe(true);
diff --git a/lib/versioning/semver/index.spec.ts b/lib/versioning/semver/index.spec.ts
index 434cf1b95ba53a2de44151f3754d2e20562815ce..eacb76892ff2cf0f914268b1ae91e7a80ad0d748 100644
--- a/lib/versioning/semver/index.spec.ts
+++ b/lib/versioning/semver/index.spec.ts
@@ -1,53 +1,55 @@
 import semver from '.';
 
-describe('semver.isValid(input)', () => {
-  it('should return null for irregular versions', () => {
-    expect(semver.isValid('17.04.0')).toBeFalsy();
-  });
-  it('should support simple semver', () => {
-    expect(semver.isValid('1.2.3')).toBeTruthy();
-  });
-  it('should support semver with dash', () => {
-    expect(semver.isValid('1.2.3-foo')).toBeTruthy();
-  });
-  it('should reject semver without dash', () => {
-    expect(semver.isValid('1.2.3foo')).toBeFalsy();
-  });
-  it('should reject ranges', () => {
-    expect(semver.isValid('~1.2.3')).toBeFalsy();
-    expect(semver.isValid('^1.2.3')).toBeFalsy();
-    expect(semver.isValid('>1.2.3')).toBeFalsy();
-  });
-  it('should reject github repositories', () => {
-    expect(semver.isValid('renovatebot/renovate')).toBeFalsy();
-    expect(semver.isValid('renovatebot/renovate#master')).toBeFalsy();
-    expect(
-      semver.isValid('https://github.com/renovatebot/renovate.git')
-    ).toBeFalsy();
-  });
-});
-describe('semver.isSingleVersion()', () => {
-  it('returns true if naked version', () => {
-    expect(semver.isSingleVersion('1.2.3')).toBeTruthy();
-    expect(semver.isSingleVersion('1.2.3-alpha.1')).toBeTruthy();
-  });
-  it('returns false if equals', () => {
-    expect(semver.isSingleVersion('=1.2.3')).toBeFalsy();
-    expect(semver.isSingleVersion('= 1.2.3')).toBeFalsy();
-  });
-  it('returns false when not version', () => {
-    expect(semver.isSingleVersion('1.x')).toBeFalsy();
-  });
-});
-describe('semver.getNewValue()', () => {
-  it('uses newVersion', () => {
-    expect(
-      semver.getNewValue({
-        currentValue: '=1.0.0',
-        rangeStrategy: 'bump',
-        currentVersion: '1.0.0',
-        newVersion: '1.1.0',
-      })
-    ).toEqual('1.1.0');
+describe('versioning/semver/index', () => {
+  describe('semver.isValid(input)', () => {
+    it('should return null for irregular versions', () => {
+      expect(semver.isValid('17.04.0')).toBeFalsy();
+    });
+    it('should support simple semver', () => {
+      expect(semver.isValid('1.2.3')).toBeTruthy();
+    });
+    it('should support semver with dash', () => {
+      expect(semver.isValid('1.2.3-foo')).toBeTruthy();
+    });
+    it('should reject semver without dash', () => {
+      expect(semver.isValid('1.2.3foo')).toBeFalsy();
+    });
+    it('should reject ranges', () => {
+      expect(semver.isValid('~1.2.3')).toBeFalsy();
+      expect(semver.isValid('^1.2.3')).toBeFalsy();
+      expect(semver.isValid('>1.2.3')).toBeFalsy();
+    });
+    it('should reject github repositories', () => {
+      expect(semver.isValid('renovatebot/renovate')).toBeFalsy();
+      expect(semver.isValid('renovatebot/renovate#master')).toBeFalsy();
+      expect(
+        semver.isValid('https://github.com/renovatebot/renovate.git')
+      ).toBeFalsy();
+    });
+  });
+  describe('semver.isSingleVersion()', () => {
+    it('returns true if naked version', () => {
+      expect(semver.isSingleVersion('1.2.3')).toBeTruthy();
+      expect(semver.isSingleVersion('1.2.3-alpha.1')).toBeTruthy();
+    });
+    it('returns false if equals', () => {
+      expect(semver.isSingleVersion('=1.2.3')).toBeFalsy();
+      expect(semver.isSingleVersion('= 1.2.3')).toBeFalsy();
+    });
+    it('returns false when not version', () => {
+      expect(semver.isSingleVersion('1.x')).toBeFalsy();
+    });
+  });
+  describe('semver.getNewValue()', () => {
+    it('uses newVersion', () => {
+      expect(
+        semver.getNewValue({
+          currentValue: '=1.0.0',
+          rangeStrategy: 'bump',
+          currentVersion: '1.0.0',
+          newVersion: '1.1.0',
+        })
+      ).toEqual('1.1.0');
+    });
   });
 });
diff --git a/lib/versioning/swift/index.spec.ts b/lib/versioning/swift/index.spec.ts
index 483374e7ca7e456ee575fe209eaff36599534770..f5503a2e21022a260249dae4cc5556e9000e8bd7 100644
--- a/lib/versioning/swift/index.spec.ts
+++ b/lib/versioning/swift/index.spec.ts
@@ -11,102 +11,106 @@ const {
   matches,
 } = swift;
 
-describe('isValid(input)', () => {
-  it('supports isVersion', () => {
-    expect(isVersion('from: "1.2.3"')).toBe(false);
-    expect(isVersion('1.2.3')).toBe(true);
-  });
-  it('understands Swift version ranges', () => {
-    expect(isValid('from: "1.2.3"')).toBe(true);
-    expect(isValid('from : "1.2.3"')).toBe(true);
-    expect(isValid('from:"1.2.3"')).toBe(true);
-    expect(isValid(' from:"1.2.3" ')).toBe(true);
-    expect(isValid(' from : "1.2.3" ')).toBe(true);
+describe('versioning/swift/index', () => {
+  describe('isValid(input)', () => {
+    it('supports isVersion', () => {
+      expect(isVersion('from: "1.2.3"')).toBe(false);
+      expect(isVersion('1.2.3')).toBe(true);
+    });
+    it('understands Swift version ranges', () => {
+      expect(isValid('from: "1.2.3"')).toBe(true);
+      expect(isValid('from : "1.2.3"')).toBe(true);
+      expect(isValid('from:"1.2.3"')).toBe(true);
+      expect(isValid(' from:"1.2.3" ')).toBe(true);
+      expect(isValid(' from : "1.2.3" ')).toBe(true);
 
-    expect(isValid('"1.2.3"..."1.2.4"')).toBe(true);
-    expect(isValid(' "1.2.3" ... "1.2.4" ')).toBe(true);
+      expect(isValid('"1.2.3"..."1.2.4"')).toBe(true);
+      expect(isValid(' "1.2.3" ... "1.2.4" ')).toBe(true);
 
-    expect(isValid('"1.2.3"...')).toBe(true);
-    expect(isValid(' "1.2.3" ... ')).toBe(true);
+      expect(isValid('"1.2.3"...')).toBe(true);
+      expect(isValid(' "1.2.3" ... ')).toBe(true);
 
-    expect(isValid('..."1.2.4"')).toBe(true);
-    expect(isValid(' ... "1.2.4" ')).toBe(true);
+      expect(isValid('..."1.2.4"')).toBe(true);
+      expect(isValid(' ... "1.2.4" ')).toBe(true);
 
-    expect(isValid('"1.2.3"..<"1.2.4"')).toBe(true);
-    expect(isValid(' "1.2.3" ..< "1.2.4" ')).toBe(true);
+      expect(isValid('"1.2.3"..<"1.2.4"')).toBe(true);
+      expect(isValid(' "1.2.3" ..< "1.2.4" ')).toBe(true);
 
-    expect(isValid('..<"1.2.4"')).toBe(true);
-    expect(isValid(' ..< "1.2.4" ')).toBe(true);
-  });
-  it('should return null for irregular versions', () => {
-    expect(isValid('17.04.0')).toBeFalsy();
-  });
-  it('should support simple semver', () => {
-    expect(isValid('1.2.3')).toBe(true);
-    expect(isValid('v1.2.3')).toBe(true);
-  });
-  it('should support semver with dash', () => {
-    expect(isValid('1.2.3-foo')).toBe(true);
-  });
-  it('should reject semver without dash', () => {
-    expect(isValid('1.2.3foo')).toBeFalsy();
-  });
-  it('should support ranges', () => {
-    expect(isValid('~1.2.3')).toBeFalsy();
-    expect(isValid('^1.2.3')).toBeFalsy();
-    expect(isValid('from: "1.2.3"')).toBe(true);
-    expect(isValid('"1.2.3"..."1.2.4"')).toBe(true);
-    expect(isValid('"1.2.3"..."1.2.4"')).toBe(true);
-    expect(isValid('"1.2.3"..<"1.2.4"')).toBe(true);
-    expect(isValid('"1.2.3"..<"1.2.4"')).toBe(true);
-    expect(isValid('..."1.2.3"')).toBe(true);
-    expect(isValid('..<"1.2.4"')).toBe(true);
-    expect(
-      minSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..<"1.2.4"')
-    ).toBe('1.2.3');
-    expect(
-      minSatisfyingVersion(['v1.2.3', 'v1.2.4', 'v1.2.5'], '..<"1.2.4"')
-    ).toBe('1.2.3');
-    expect(
-      getSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..<"1.2.4"')
-    ).toBe('1.2.3');
-    expect(
-      getSatisfyingVersion(['v1.2.3', 'v1.2.4', 'v1.2.5'], '..<"1.2.4"')
-    ).toBe('1.2.3');
-    expect(
-      getSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..."1.2.4"')
-    ).toBe('1.2.4');
-    expect(isLessThanRange('1.2.3', '..."1.2.4"')).toBe(false);
-    expect(isLessThanRange('v1.2.3', '..."1.2.4"')).toBe(false);
-    expect(isLessThanRange('1.2.3', '"1.2.4"...')).toBe(true);
-    expect(isLessThanRange('v1.2.3', '"1.2.4"...')).toBe(true);
+      expect(isValid('..<"1.2.4"')).toBe(true);
+      expect(isValid(' ..< "1.2.4" ')).toBe(true);
+    });
+    it('should return null for irregular versions', () => {
+      expect(isValid('17.04.0')).toBeFalsy();
+    });
+    it('should support simple semver', () => {
+      expect(isValid('1.2.3')).toBe(true);
+      expect(isValid('v1.2.3')).toBe(true);
+    });
+    it('should support semver with dash', () => {
+      expect(isValid('1.2.3-foo')).toBe(true);
+    });
+    it('should reject semver without dash', () => {
+      expect(isValid('1.2.3foo')).toBeFalsy();
+    });
+    it('should support ranges', () => {
+      expect(isValid('~1.2.3')).toBeFalsy();
+      expect(isValid('^1.2.3')).toBeFalsy();
+      expect(isValid('from: "1.2.3"')).toBe(true);
+      expect(isValid('"1.2.3"..."1.2.4"')).toBe(true);
+      expect(isValid('"1.2.3"..."1.2.4"')).toBe(true);
+      expect(isValid('"1.2.3"..<"1.2.4"')).toBe(true);
+      expect(isValid('"1.2.3"..<"1.2.4"')).toBe(true);
+      expect(isValid('..."1.2.3"')).toBe(true);
+      expect(isValid('..<"1.2.4"')).toBe(true);
+      expect(
+        minSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..<"1.2.4"')
+      ).toBe('1.2.3');
+      expect(
+        minSatisfyingVersion(['v1.2.3', 'v1.2.4', 'v1.2.5'], '..<"1.2.4"')
+      ).toBe('1.2.3');
+      expect(
+        getSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..<"1.2.4"')
+      ).toBe('1.2.3');
+      expect(
+        getSatisfyingVersion(['v1.2.3', 'v1.2.4', 'v1.2.5'], '..<"1.2.4"')
+      ).toBe('1.2.3');
+      expect(
+        getSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..."1.2.4"')
+      ).toBe('1.2.4');
+      expect(isLessThanRange('1.2.3', '..."1.2.4"')).toBe(false);
+      expect(isLessThanRange('v1.2.3', '..."1.2.4"')).toBe(false);
+      expect(isLessThanRange('1.2.3', '"1.2.4"...')).toBe(true);
+      expect(isLessThanRange('v1.2.3', '"1.2.4"...')).toBe(true);
 
-    expect(matches('1.2.4', '..."1.2.4"')).toBe(true);
-    expect(matches('v1.2.4', '..."1.2.4"')).toBe(true);
-    expect(matches('1.2.4', '..."1.2.3"')).toBe(false);
-    expect(matches('v1.2.4', '..."1.2.3"')).toBe(false);
+      expect(matches('1.2.4', '..."1.2.4"')).toBe(true);
+      expect(matches('v1.2.4', '..."1.2.4"')).toBe(true);
+      expect(matches('1.2.4', '..."1.2.3"')).toBe(false);
+      expect(matches('v1.2.4', '..."1.2.3"')).toBe(false);
+    });
   });
-});
-describe('getNewValue()', () => {
-  it('supports range update', () => {
-    [
-      ['1.2.3', 'auto', '1.2.3', '1.2.4', '1.2.3'],
-      ['v1.2.3', 'auto', 'v1.2.3', 'v1.2.4', 'v1.2.3'],
-      ['from: "1.2.3"', 'auto', '1.2.3', '1.2.4', 'from: "1.2.4"'],
-      ['from: "1.2.2"', 'auto', '1.2.3', '1.2.4', 'from: "1.2.4"'],
-      ['"1.2.3"...', 'auto', '1.2.3', '1.2.4', '"1.2.4"...'],
-      ['"1.2.3"..."1.2.4"', 'auto', '1.2.3', '1.2.5', '"1.2.3"..."1.2.5"'],
-      ['"1.2.3"..<"1.2.4"', 'auto', '1.2.3', '1.2.5', '"1.2.3"..<"1.2.5"'],
-      ['..."1.2.4"', 'auto', '1.2.3', '1.2.5', '..."1.2.5"'],
-      ['..<"1.2.4"', 'auto', '1.2.3', '1.2.5', '..<"1.2.5"'],
-    ].forEach(([range, rangeStrategy, currentVersion, newVersion, result]) => {
-      const newValue = getNewValue({
-        currentValue: range,
-        rangeStrategy: rangeStrategy as RangeStrategy,
-        currentVersion,
-        newVersion,
-      });
-      expect(newValue).toEqual(result);
+  describe('getNewValue()', () => {
+    it('supports range update', () => {
+      [
+        ['1.2.3', 'auto', '1.2.3', '1.2.4', '1.2.3'],
+        ['v1.2.3', 'auto', 'v1.2.3', 'v1.2.4', 'v1.2.3'],
+        ['from: "1.2.3"', 'auto', '1.2.3', '1.2.4', 'from: "1.2.4"'],
+        ['from: "1.2.2"', 'auto', '1.2.3', '1.2.4', 'from: "1.2.4"'],
+        ['"1.2.3"...', 'auto', '1.2.3', '1.2.4', '"1.2.4"...'],
+        ['"1.2.3"..."1.2.4"', 'auto', '1.2.3', '1.2.5', '"1.2.3"..."1.2.5"'],
+        ['"1.2.3"..<"1.2.4"', 'auto', '1.2.3', '1.2.5', '"1.2.3"..<"1.2.5"'],
+        ['..."1.2.4"', 'auto', '1.2.3', '1.2.5', '..."1.2.5"'],
+        ['..<"1.2.4"', 'auto', '1.2.3', '1.2.5', '..<"1.2.5"'],
+      ].forEach(
+        ([range, rangeStrategy, currentVersion, newVersion, result]) => {
+          const newValue = getNewValue({
+            currentValue: range,
+            rangeStrategy: rangeStrategy as RangeStrategy,
+            currentVersion,
+            newVersion,
+          });
+          expect(newValue).toEqual(result);
+        }
+      );
     });
   });
 });
diff --git a/lib/versioning/ubuntu/index.spec.ts b/lib/versioning/ubuntu/index.spec.ts
index 277859e3d70119c7c935d8d8a3501a3526df8856..f9f8d774fa8748f8142da017f62fc31d839604b0 100644
--- a/lib/versioning/ubuntu/index.spec.ts
+++ b/lib/versioning/ubuntu/index.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../test/util';
 import { api as ubuntu } from '.';
 
-describe(getName(), () => {
+describe('versioning/ubuntu/index', () => {
   // validation
 
   it('isValid', () => {
diff --git a/lib/versioning/versioning-metadata.spec.ts b/lib/versioning/versioning-metadata.spec.ts
index 38d0b26e735d57841c319e4473cfea1dca655208..371d9abadf7467297c4fa02f3167ba8574ad0d41 100644
--- a/lib/versioning/versioning-metadata.spec.ts
+++ b/lib/versioning/versioning-metadata.spec.ts
@@ -1,6 +1,6 @@
 import { readFile, readdir } from 'fs-extra';
 
-describe('versioning metadata', () => {
+describe('versioning/versioning-metadata', () => {
   it('readme no markdown headers', async () => {
     const allVersioning = (await readdir('lib/versioning')).filter(
       (item) => !item.includes('.')
diff --git a/lib/workers/branch/auto-replace.spec.ts b/lib/workers/branch/auto-replace.spec.ts
index 8eaccfdeeec358b8df20cf61700419148d8e1a7f..99faf7b5ab30b2c6281288f88311d96ff69f458d 100644
--- a/lib/workers/branch/auto-replace.spec.ts
+++ b/lib/workers/branch/auto-replace.spec.ts
@@ -1,4 +1,4 @@
-import { defaultConfig, getName, loadFixture } from '../../../test/util';
+import { defaultConfig, loadFixture } from '../../../test/util';
 import { WORKER_FILE_UPDATE_FAILED } from '../../constants/error-messages';
 import { extractPackageFile } from '../../manager/html';
 import type { BranchUpgradeConfig } from '../types';
@@ -8,7 +8,7 @@ const sampleHtml = loadFixture('sample.html', `../../manager/html`);
 
 jest.mock('../../util/fs');
 
-describe(getName(), () => {
+describe('workers/branch/auto-replace', () => {
   describe('doAutoReplace', () => {
     let reuseExistingBranch: boolean;
     let upgrade: BranchUpgradeConfig;
diff --git a/lib/workers/branch/automerge.spec.ts b/lib/workers/branch/automerge.spec.ts
index e62d94f1942ec755ee59a5a8848fd7dd012cb39f..9b6439f4fe381898ee37ad396384d52921f7a23e 100644
--- a/lib/workers/branch/automerge.spec.ts
+++ b/lib/workers/branch/automerge.spec.ts
@@ -1,4 +1,4 @@
-import { defaultConfig, getName, git, platform } from '../../../test/util';
+import { defaultConfig, git, platform } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RenovateConfig } from '../../config/types';
 import { BranchStatus } from '../../types';
@@ -6,7 +6,7 @@ import { tryBranchAutomerge } from './automerge';
 
 jest.mock('../../util/git');
 
-describe(getName(), () => {
+describe('workers/branch/automerge', () => {
   describe('tryBranchAutomerge', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/branch/check-existing.spec.ts b/lib/workers/branch/check-existing.spec.ts
index e20ca7d3369832dcac32c16e0b030a0853c99be8..8149ac4f40a1bbb31834e631a8bc056deb5eb98b 100644
--- a/lib/workers/branch/check-existing.spec.ts
+++ b/lib/workers/branch/check-existing.spec.ts
@@ -1,9 +1,9 @@
-import { defaultConfig, getName, partial, platform } from '../../../test/util';
+import { defaultConfig, partial, platform } from '../../../test/util';
 import { PrState } from '../../types';
 import type { BranchConfig } from '../types';
 import { prAlreadyExisted } from './check-existing';
 
-describe(getName(), () => {
+describe('workers/branch/check-existing', () => {
   describe('prAlreadyExisted', () => {
     let config: BranchConfig;
     beforeEach(() => {
diff --git a/lib/workers/branch/commit.spec.ts b/lib/workers/branch/commit.spec.ts
index 7c5593b0eee74d1b124913352bfd12b72d3550a7..3062c17bba7a50245c651878e4a9f32483d72c70 100644
--- a/lib/workers/branch/commit.spec.ts
+++ b/lib/workers/branch/commit.spec.ts
@@ -1,11 +1,11 @@
-import { defaultConfig, getName, git, partial } from '../../../test/util';
+import { defaultConfig, git, partial } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { BranchConfig } from '../types';
 import { commitFilesToBranch } from './commit';
 
 jest.mock('../../util/git');
 
-describe(getName(), () => {
+describe('workers/branch/commit', () => {
   describe('commitFilesToBranch', () => {
     let config: BranchConfig;
     beforeEach(() => {
diff --git a/lib/workers/branch/get-updated.spec.ts b/lib/workers/branch/get-updated.spec.ts
index 406d82e30880c8ac1a57e209ca7df28daf0440c7..fd084c5456f0539d6200877ddb21f3d5c711226d 100644
--- a/lib/workers/branch/get-updated.spec.ts
+++ b/lib/workers/branch/get-updated.spec.ts
@@ -1,4 +1,4 @@
-import { defaultConfig, getName, git, mocked } from '../../../test/util';
+import { defaultConfig, git, mocked } from '../../../test/util';
 import * as datasourceGitRefs from '../../datasource/git-refs';
 import * as _composer from '../../manager/composer';
 import * as _gitSubmodules from '../../manager/git-submodules';
@@ -21,7 +21,7 @@ jest.mock('../../manager/git-submodules');
 jest.mock('../../util/git');
 jest.mock('./auto-replace');
 
-describe(getName(), () => {
+describe('workers/branch/get-updated', () => {
   describe('getUpdatedPackageFiles()', () => {
     let config: BranchConfig;
     beforeEach(() => {
diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts
index 61a75d1e1821627e4471700ad98eb33cb6da3de0..3e4697fea274be40d9ecf583f1e2da980ff26d37 100644
--- a/lib/workers/branch/index.spec.ts
+++ b/lib/workers/branch/index.spec.ts
@@ -1,11 +1,5 @@
 import * as _fs from 'fs-extra';
-import {
-  defaultConfig,
-  getName,
-  git,
-  mocked,
-  platform,
-} from '../../../test/util';
+import { defaultConfig, git, mocked, platform } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import type { RepoGlobalConfig } from '../../config/types';
 import {
@@ -68,7 +62,7 @@ const limits = mocked(_limits);
 
 const adminConfig: RepoGlobalConfig = { localDir: '', cacheDir: '' };
 
-describe(getName(), () => {
+describe('workers/branch/index', () => {
   describe('processBranch', () => {
     const updatedPackageFiles: PackageFilesResult = {
       updatedPackageFiles: [],
diff --git a/lib/workers/branch/lock-files/index.spec.ts b/lib/workers/branch/lock-files/index.spec.ts
index 0933484052dbd711e9ffed9caec87241ab4c79ca..f226dcec5a87755b509b164adbfdb6c5cbc20295 100644
--- a/lib/workers/branch/lock-files/index.spec.ts
+++ b/lib/workers/branch/lock-files/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, git, mocked } from '../../../../test/util';
+import { git, mocked } from '../../../../test/util';
 import { getConfig } from '../../../config/defaults';
 import { setGlobalConfig } from '../../../config/global';
 import * as _lockFiles from '../../../manager/npm/post-update';
@@ -28,7 +28,7 @@ hostRules.find = jest.fn((_) => ({
 
 const { writeUpdatedPackageFiles, getAdditionalFiles } = lockFiles;
 
-describe(getName(), () => {
+describe('workers/branch/lock-files/index', () => {
   describe('writeUpdatedPackageFiles', () => {
     beforeEach(() => {
       setGlobalConfig({
diff --git a/lib/workers/branch/reuse.spec.ts b/lib/workers/branch/reuse.spec.ts
index 1926d260e0f3da7648b7da8b7c9d9b8f1b0b171e..0cec4b645b98743c343a617aa1ecaf60ac228350 100644
--- a/lib/workers/branch/reuse.spec.ts
+++ b/lib/workers/branch/reuse.spec.ts
@@ -1,4 +1,4 @@
-import { getName, git, platform } from '../../../test/util';
+import { git, platform } from '../../../test/util';
 import type { RenovateConfig } from '../../config/types';
 import { Pr } from '../../platform';
 import { PrState } from '../../types';
@@ -6,7 +6,7 @@ import { shouldReuseExistingBranch } from './reuse';
 
 jest.mock('../../util/git');
 
-describe(getName(), () => {
+describe('workers/branch/reuse', () => {
   describe('shouldReuseExistingBranch(config)', () => {
     const pr: Pr = {
       sourceBranch: 'master',
diff --git a/lib/workers/branch/schedule.spec.ts b/lib/workers/branch/schedule.spec.ts
index 0ad1dfb7f00446202c406ad93f40087fd1248d6e..c6f17ab03f8ee204d9d21bd7378eb75af22a276e 100644
--- a/lib/workers/branch/schedule.spec.ts
+++ b/lib/workers/branch/schedule.spec.ts
@@ -1,9 +1,8 @@
 import mockDate from 'mockdate';
-import { getName } from '../../../test/util';
 import type { RenovateConfig } from '../../config/types';
 import * as schedule from './schedule';
 
-describe(getName(), () => {
+describe('workers/branch/schedule', () => {
   describe('hasValidTimezone(schedule)', () => {
     it('returns false for invalid timezone', () => {
       expect(schedule.hasValidTimezone('Asia')[0]).toBe(false);
diff --git a/lib/workers/branch/status-checks.spec.ts b/lib/workers/branch/status-checks.spec.ts
index c85c9673e8c79173b426d389f4726486b244d180..02c15babf94a8af376bf38e708358de7aa06576e 100644
--- a/lib/workers/branch/status-checks.spec.ts
+++ b/lib/workers/branch/status-checks.spec.ts
@@ -1,4 +1,4 @@
-import { defaultConfig, getName, platform } from '../../../test/util';
+import { defaultConfig, platform } from '../../../test/util';
 import { BranchStatus } from '../../types';
 import {
   ConfidenceConfig,
@@ -7,7 +7,7 @@ import {
   setStability,
 } from './status-checks';
 
-describe(getName(), () => {
+describe('workers/branch/status-checks', () => {
   describe('setStability', () => {
     let config: StabilityConfig;
     beforeEach(() => {
diff --git a/lib/workers/global/autodiscover.spec.ts b/lib/workers/global/autodiscover.spec.ts
index 7e5d2f08fa993f7db99e6e01dc279efc5597d9fc..6a564570c16d1f0d9823db01cc0ca31ea1dbdec2 100644
--- a/lib/workers/global/autodiscover.spec.ts
+++ b/lib/workers/global/autodiscover.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import type { RenovateConfig } from '../../config/types';
 import { PLATFORM_TYPE_GITHUB } from '../../constants/platforms';
 import * as platform from '../../platform';
@@ -13,7 +12,7 @@ jest.unmock('../../platform');
 const hostRules = _hostRules;
 const ghApi: jest.Mocked<typeof _ghApi> = _ghApi as never;
 
-describe(getName(), () => {
+describe('workers/global/autodiscover', () => {
   let config: RenovateConfig;
   beforeEach(async () => {
     jest.resetAllMocks();
diff --git a/lib/workers/global/config/parse/cli.spec.ts b/lib/workers/global/config/parse/cli.spec.ts
index b0b86fd2de14e1c0a5f78d6809528e81edbb3083..fbce467a3c617b058825da05d02fc2cc1eff088e 100644
--- a/lib/workers/global/config/parse/cli.spec.ts
+++ b/lib/workers/global/config/parse/cli.spec.ts
@@ -1,10 +1,9 @@
-import { getName } from '../../../../../test/util';
 import type { RenovateOptions } from '../../../../config/types';
 import * as datasourceDocker from '../../../../datasource/docker';
 import getArgv from './__fixtures__/argv';
 import * as cli from './cli';
 
-describe(getName(), () => {
+describe('workers/global/config/parse/cli', () => {
   let argv: string[];
   beforeEach(() => {
     argv = getArgv();
diff --git a/lib/workers/global/config/parse/env.spec.ts b/lib/workers/global/config/parse/env.spec.ts
index db5e084318759ff45ccdc4042b430e538efb2ed8..528179ea0a99eabec895e7f1d0ca55800a70a925 100644
--- a/lib/workers/global/config/parse/env.spec.ts
+++ b/lib/workers/global/config/parse/env.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../../../test/util';
 import type { RenovateOptions } from '../../../../config/types';
 import {
   PLATFORM_TYPE_BITBUCKET,
@@ -6,7 +5,7 @@ import {
 } from '../../../../constants/platforms';
 import * as env from './env';
 
-describe(getName(), () => {
+describe('workers/global/config/parse/env', () => {
   describe('.getConfig(env)', () => {
     it('returns empty env', () => {
       expect(env.getConfig({})).toEqual({ hostRules: [] });
diff --git a/lib/workers/global/config/parse/file.spec.ts b/lib/workers/global/config/parse/file.spec.ts
index df3540a416ac0320787d492b0c85bfd36b09261c..f0c34648079d4c644d9cc481a022e45e7a98cb51 100644
--- a/lib/workers/global/config/parse/file.spec.ts
+++ b/lib/workers/global/config/parse/file.spec.ts
@@ -1,11 +1,10 @@
 import fs from 'fs';
 import { DirectoryResult, dir } from 'tmp-promise';
 import upath from 'upath';
-import { getName } from '../../../../../test/util';
 import customConfig from './__fixtures__/file';
 import * as file from './file';
 
-describe(getName(), () => {
+describe('workers/global/config/parse/file', () => {
   let tmp: DirectoryResult;
 
   beforeAll(async () => {
diff --git a/lib/workers/global/config/parse/index.spec.ts b/lib/workers/global/config/parse/index.spec.ts
index 20412bddc1cc5feddb3f81f912be7e59b1b67edc..cb272123189cbf0a5ab577efcb66bd11e4c63051 100644
--- a/lib/workers/global/config/parse/index.spec.ts
+++ b/lib/workers/global/config/parse/index.spec.ts
@@ -1,5 +1,4 @@
 import upath from 'upath';
-import { getName } from '../../../../../test/util';
 import { readFile } from '../../../../util/fs';
 import getArgv from './__fixtures__/argv';
 
@@ -10,7 +9,7 @@ try {
   // file does not exist
 }
 
-describe(getName(), () => {
+describe('workers/global/config/parse/index', () => {
   describe('.parseConfigs(env, defaultArgv)', () => {
     let configParser: typeof import('.');
     let defaultArgv: string[];
diff --git a/lib/workers/global/index.spec.ts b/lib/workers/global/index.spec.ts
index 624ee5784f7cdfeb6d4e35e59df29b13f38331f5..988d2b352e10816051e5bf13e0a7cdc83d1fd772 100644
--- a/lib/workers/global/index.spec.ts
+++ b/lib/workers/global/index.spec.ts
@@ -1,5 +1,5 @@
 import { ERROR, WARN } from 'bunyan';
-import { getName, logger } from '../../../test/util';
+import { logger } from '../../../test/util';
 import {
   PLATFORM_TYPE_GITHUB,
   PLATFORM_TYPE_GITLAB,
@@ -19,7 +19,7 @@ const configParser: jest.Mocked<typeof _configParser> = _configParser as never;
 const platform: jest.Mocked<typeof _platform> = _platform as never;
 const limits = _limits;
 
-describe(getName(), () => {
+describe('workers/global/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     logger.getProblems.mockImplementationOnce(() => []);
diff --git a/lib/workers/global/limits.spec.ts b/lib/workers/global/limits.spec.ts
index 1b62c0c7607b97520aa2526f06936cdbefdab375..70513dd4ee0b8d3ff1f0bb06ebd962448e0ac957 100644
--- a/lib/workers/global/limits.spec.ts
+++ b/lib/workers/global/limits.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import {
   Limit,
   incLimitedValue,
@@ -7,7 +6,7 @@ import {
   setMaxLimit,
 } from './limits';
 
-describe(getName(), () => {
+describe('workers/global/limits', () => {
   beforeEach(() => {
     resetAllLimits();
   });
diff --git a/lib/workers/pr/automerge.spec.ts b/lib/workers/pr/automerge.spec.ts
index 416b3e670c46b941c9803575710c85b82e588e31..1268a50562dfa7fa1e9b9d8726f6e421b00e6709 100644
--- a/lib/workers/pr/automerge.spec.ts
+++ b/lib/workers/pr/automerge.spec.ts
@@ -1,4 +1,4 @@
-import { getConfig, getName, git, mocked, partial } from '../../../test/util';
+import { getConfig, git, mocked, partial } from '../../../test/util';
 import { Pr, platform as _platform } from '../../platform';
 import { BranchStatus } from '../../types';
 import { BranchConfig } from '../types';
@@ -9,7 +9,7 @@ jest.mock('../../util/git');
 const platform = mocked(_platform);
 const defaultConfig = getConfig();
 
-describe(getName(), () => {
+describe('workers/pr/automerge', () => {
   describe('checkAutoMerge(pr, config)', () => {
     let config: BranchConfig;
     let pr: Pr;
diff --git a/lib/workers/pr/body/controls.spec.ts b/lib/workers/pr/body/controls.spec.ts
index 7961b26fd8036df2286882b80b9e021e7222793e..50724044d383deb50841a6d52263561ab71a378b 100644
--- a/lib/workers/pr/body/controls.spec.ts
+++ b/lib/workers/pr/body/controls.spec.ts
@@ -1,11 +1,11 @@
 import { mock } from 'jest-mock-extended';
-import { getName, git } from '../../../../test/util';
+import { git } from '../../../../test/util';
 import { BranchConfig } from '../../types';
 import { getControls } from './controls';
 
 jest.mock('../../../util/git');
 
-describe(getName(), () => {
+describe('workers/pr/body/controls', () => {
   describe('getControls', () => {
     let branchConfig: BranchConfig;
     beforeEach(() => {
diff --git a/lib/workers/pr/changelog/github.spec.ts b/lib/workers/pr/changelog/github.spec.ts
index 19cec8280c715f557105ce65cf79a5d917e66159..8a260df07a9327f32fd6b505e9443f13760a13ab 100644
--- a/lib/workers/pr/changelog/github.spec.ts
+++ b/lib/workers/pr/changelog/github.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName } from '../../../../test/util';
 import { PLATFORM_TYPE_GITHUB } from '../../../constants/platforms';
 import * as hostRules from '../../../util/host-rules';
 import * as semverVersioning from '../../../versioning/semver';
@@ -30,7 +29,7 @@ const upgrade: BranchUpgradeConfig = {
   ],
 };
 
-describe(getName(), () => {
+describe('workers/pr/changelog/github', () => {
   afterEach(() => {
     // FIXME: add missing http mocks
     httpMock.clear(false);
diff --git a/lib/workers/pr/changelog/gitlab.spec.ts b/lib/workers/pr/changelog/gitlab.spec.ts
index 4a74ab94d1224317aebea7bddc98e948918502c0..1235d29d958f5e7d31d669d8aab667aa81373f2b 100644
--- a/lib/workers/pr/changelog/gitlab.spec.ts
+++ b/lib/workers/pr/changelog/gitlab.spec.ts
@@ -1,5 +1,4 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName } from '../../../../test/util';
 import { PLATFORM_TYPE_GITLAB } from '../../../constants/platforms';
 import * as hostRules from '../../../util/host-rules';
 import * as semverVersioning from '../../../versioning/semver';
@@ -31,7 +30,7 @@ const upgrade: BranchUpgradeConfig = {
 
 const matchHost = 'https://gitlab.com/';
 
-describe(getName(), () => {
+describe('workers/pr/changelog/gitlab', () => {
   afterEach(() => {
     // FIXME: add missing http mocks
     httpMock.clear(false);
diff --git a/lib/workers/pr/changelog/index.spec.ts b/lib/workers/pr/changelog/index.spec.ts
index 85a2f07cf8a61e63988a1c2aa709669d7dd1684c..ae462fceeca81244c82e5b7e1eae3b0c82308ead 100644
--- a/lib/workers/pr/changelog/index.spec.ts
+++ b/lib/workers/pr/changelog/index.spec.ts
@@ -1,5 +1,5 @@
 import * as httpMock from '../../../../test/http-mock';
-import { getName, partial } from '../../../../test/util';
+import { partial } from '../../../../test/util';
 import { PLATFORM_TYPE_GITHUB } from '../../../constants/platforms';
 import * as hostRules from '../../../util/host-rules';
 import * as semverVersioning from '../../../versioning/semver';
@@ -31,7 +31,7 @@ const upgrade: BranchConfig = partial<BranchConfig>({
   ],
 });
 
-describe(getName(), () => {
+describe('workers/pr/changelog/index', () => {
   describe('getChangeLogJSON', () => {
     beforeEach(() => {
       hostRules.clear();
diff --git a/lib/workers/pr/changelog/release-notes.spec.ts b/lib/workers/pr/changelog/release-notes.spec.ts
index 766afc35bb78b4537a6d88208410b18ff0b8ba2e..526e23d19019683ba0fee9cc76036a9a5df42bb7 100644
--- a/lib/workers/pr/changelog/release-notes.spec.ts
+++ b/lib/workers/pr/changelog/release-notes.spec.ts
@@ -1,6 +1,6 @@
 import { DateTime } from 'luxon';
 import * as httpMock from '../../../../test/http-mock';
-import { getName, loadFixture, mocked } from '../../../../test/util';
+import { loadFixture, mocked } from '../../../../test/util';
 import { clone } from '../../../util/clone';
 import * as _hostRules from '../../../util/host-rules';
 import {
@@ -37,7 +37,7 @@ const gitlabTreeResponse = [
   { path: 'README.md', type: 'blob' },
 ];
 
-describe(getName(), () => {
+describe('workers/pr/changelog/release-notes', () => {
   beforeEach(() => {
     hostRules.find.mockReturnValue({});
     hostRules.hosts.mockReturnValue([]);
diff --git a/lib/workers/pr/changelog/releases.spec.ts b/lib/workers/pr/changelog/releases.spec.ts
index a0f924c1c6babcbbbbdd2bccd2d862f5eb5874d2..8df46ef4d370483f5550d9816ed44fe5fb2466f4 100644
--- a/lib/workers/pr/changelog/releases.spec.ts
+++ b/lib/workers/pr/changelog/releases.spec.ts
@@ -1,11 +1,11 @@
-import { getName, partial } from '../../../../test/util';
+import { partial } from '../../../../test/util';
 import * as datasource from '../../../datasource';
 import * as dockerVersioning from '../../../versioning/docker';
 import * as npmVersioning from '../../../versioning/npm';
 import type { BranchUpgradeConfig } from '../../types';
 import * as releases from './releases';
 
-describe(getName(), () => {
+describe('workers/pr/changelog/releases', () => {
   describe('getReleaseNotes()', () => {
     beforeEach(() => {
       jest.spyOn(datasource, 'getPkgReleases').mockResolvedValueOnce({
diff --git a/lib/workers/pr/code-owners.spec.ts b/lib/workers/pr/code-owners.spec.ts
index 9bb83a09ee191172cd0f145ce16c31968a18c44d..8832dfddbd9f4ddae4f24217cced4e86bd47c453 100644
--- a/lib/workers/pr/code-owners.spec.ts
+++ b/lib/workers/pr/code-owners.spec.ts
@@ -1,12 +1,12 @@
 import { mock } from 'jest-mock-extended';
-import { fs, getName, git } from '../../../test/util';
+import { fs, git } from '../../../test/util';
 import { Pr } from '../../platform';
 import { codeOwnersForPr } from './code-owners';
 
 jest.mock('../../util/fs');
 jest.mock('../../util/git');
 
-describe(getName(), () => {
+describe('workers/pr/code-owners', () => {
   describe('codeOwnersForPr', () => {
     let pr: Pr;
     beforeEach(() => {
diff --git a/lib/workers/pr/index.spec.ts b/lib/workers/pr/index.spec.ts
index b3c4749a48b0535d387f953ca34fb6000e32e583..746c5dff8fe041988c891dfebd7afdc2224b9bf1 100644
--- a/lib/workers/pr/index.spec.ts
+++ b/lib/workers/pr/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, git, mocked, partial } from '../../../test/util';
+import { git, mocked, partial } from '../../../test/util';
 import { getConfig } from '../../config/defaults';
 import { PLATFORM_TYPE_GITLAB } from '../../constants/platforms';
 import { Pr, platform as _platform } from '../../platform';
@@ -97,7 +97,7 @@ function setupGitlabChangelogMock() {
   gitlabChangelogHelper.getChangeLogJSON.mockResolvedValue(resultValue);
 }
 
-describe(getName(), () => {
+describe('workers/pr/index', () => {
   describe('checkAutoMerge(pr, config)', () => {
     let config: BranchConfig;
     let pr: Pr;
diff --git a/lib/workers/repository/configured.spec.ts b/lib/workers/repository/configured.spec.ts
index 16983952ba6e5b31ca100e33e6d8ffee693d232a..521af441239e1f6b613d1fc9fd705baa83d66ba1 100644
--- a/lib/workers/repository/configured.spec.ts
+++ b/lib/workers/repository/configured.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName } from '../../../test/util';
+import { RenovateConfig, getConfig } from '../../../test/util';
 import { checkIfConfigured } from './configured';
 
 let config: RenovateConfig;
@@ -7,7 +7,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('workers/repository/configured', () => {
   describe('checkIfConfigured()', () => {
     it('returns', () => {
       expect(() => checkIfConfigured(config)).not.toThrow();
diff --git a/lib/workers/repository/dependency-dashboard.spec.ts b/lib/workers/repository/dependency-dashboard.spec.ts
index 6d968fe3e6eb3f23e7e0cc1b917f7c934d2a244f..21955fe7b722f23d6a299322d9cbd89fe3697179 100644
--- a/lib/workers/repository/dependency-dashboard.spec.ts
+++ b/lib/workers/repository/dependency-dashboard.spec.ts
@@ -3,7 +3,6 @@ import { mock } from 'jest-mock-extended';
 import {
   RenovateConfig,
   getConfig,
-  getName,
   loadFixture,
   logger,
   platform,
@@ -41,7 +40,7 @@ async function dryRun(
   expect(platform.ensureIssue).toHaveBeenCalledTimes(ensureIssueCalls);
 }
 
-describe(getName(), () => {
+describe('workers/repository/dependency-dashboard', () => {
   describe('readDashboardBody()', () => {
     it('reads dashboard body', async () => {
       const conf: RenovateConfig = {};
diff --git a/lib/workers/repository/error-config.spec.ts b/lib/workers/repository/error-config.spec.ts
index 7c26ea9001c2d5cdc12a2bf2a43761bfb79a78dd..6f791725ce62b8d1e86baee88bf73bc029399f64 100644
--- a/lib/workers/repository/error-config.spec.ts
+++ b/lib/workers/repository/error-config.spec.ts
@@ -1,10 +1,5 @@
 import { mock } from 'jest-mock-extended';
-import {
-  RenovateConfig,
-  getConfig,
-  getName,
-  platform,
-} from '../../../test/util';
+import { RenovateConfig, getConfig, platform } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import { CONFIG_VALIDATION } from '../../constants/error-messages';
 import { Pr } from '../../platform';
@@ -19,7 +14,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('workers/repository/error-config', () => {
   describe('raiseConfigWarningIssue()', () => {
     beforeEach(() => {
       setGlobalConfig();
diff --git a/lib/workers/repository/error.spec.ts b/lib/workers/repository/error.spec.ts
index f99b290d9694c85fa96b7be3595b76e5fb217b81..4d79735e3c2a2675992d2741062c3ae6564da301 100644
--- a/lib/workers/repository/error.spec.ts
+++ b/lib/workers/repository/error.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName } from '../../../test/util';
+import { RenovateConfig, getConfig } from '../../../test/util';
 import {
   CONFIG_SECRETS_EXPOSED,
   CONFIG_VALIDATION,
@@ -38,7 +38,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('workers/repository/error', () => {
   describe('handleError()', () => {
     const errors = [
       REPOSITORY_UNINITIATED,
diff --git a/lib/workers/repository/extract/file-match.spec.ts b/lib/workers/repository/extract/file-match.spec.ts
index a87f66406592ed35b487cebe9753a7334a754427..f9b100a59d6193a50d4117fc84ce3e70d820c492 100644
--- a/lib/workers/repository/extract/file-match.spec.ts
+++ b/lib/workers/repository/extract/file-match.spec.ts
@@ -1,9 +1,9 @@
-import { RenovateConfig, getName } from '../../../../test/util';
+import { RenovateConfig } from '../../../../test/util';
 import * as fileMatch from './file-match';
 
 jest.mock('../../../util/git');
 
-describe(getName(), () => {
+describe('workers/repository/extract/file-match', () => {
   const fileList = ['package.json', 'frontend/package.json'];
   describe('getIncludedFiles()', () => {
     it('returns fileList if no includePaths', () => {
diff --git a/lib/workers/repository/extract/index.spec.ts b/lib/workers/repository/extract/index.spec.ts
index d00bccd0551dd8bb5591106f5db0cff260e6d9b8..ee87d1e10875ccccaa4c5f741d2865249c6de01a 100644
--- a/lib/workers/repository/extract/index.spec.ts
+++ b/lib/workers/repository/extract/index.spec.ts
@@ -1,4 +1,4 @@
-import { defaultConfig, getName, git, mocked } from '../../../../test/util';
+import { defaultConfig, git, mocked } from '../../../../test/util';
 import type { RenovateConfig } from '../../../config/types';
 import * as _managerFiles from './manager-files';
 import { extractAllDependencies } from '.';
@@ -8,7 +8,7 @@ jest.mock('../../../util/git');
 
 const managerFiles = mocked(_managerFiles);
 
-describe(getName(), () => {
+describe('workers/repository/extract/index', () => {
   describe('extractAllDependencies()', () => {
     let config: RenovateConfig;
     const fileList = ['README', 'package.json', 'tasks/ansible.yaml'];
diff --git a/lib/workers/repository/extract/manager-files.spec.ts b/lib/workers/repository/extract/manager-files.spec.ts
index b3d9c3fba3c72101fab4a8743458e2f74b29c72d..c83f5a55f7ad60da1012f0c3dfd3f4fb909c2469 100644
--- a/lib/workers/repository/extract/manager-files.spec.ts
+++ b/lib/workers/repository/extract/manager-files.spec.ts
@@ -1,4 +1,4 @@
-import { fs, getConfig, getName, mocked } from '../../../../test/util';
+import { fs, getConfig, mocked } from '../../../../test/util';
 import type { RenovateConfig } from '../../../config/types';
 import * as _html from '../../../manager/html';
 import * as _fileMatch from './file-match';
@@ -11,7 +11,7 @@ jest.mock('../../../util/fs');
 const fileMatch = mocked(_fileMatch);
 const html = mocked(_html);
 
-describe(getName(), () => {
+describe('workers/repository/extract/manager-files', () => {
   describe('getManagerPackageFiles()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/finalise/prune.spec.ts b/lib/workers/repository/finalise/prune.spec.ts
index 04fc03c9d24be9edfc5a242b024aca8220c17afe..05868f977131b09f07e9565a496a2e5a2cc925e9 100644
--- a/lib/workers/repository/finalise/prune.spec.ts
+++ b/lib/workers/repository/finalise/prune.spec.ts
@@ -1,7 +1,6 @@
 import {
   RenovateConfig,
   getConfig,
-  getName,
   git,
   platform,
 } from '../../../../test/util';
@@ -20,7 +19,7 @@ beforeEach(() => {
   config.warnings = [];
 });
 
-describe(getName(), () => {
+describe('workers/repository/finalise/prune', () => {
   describe('pruneStaleBranches()', () => {
     beforeEach(() => {
       setGlobalConfig();
diff --git a/lib/workers/repository/index.spec.ts b/lib/workers/repository/index.spec.ts
index 4bff4b655db4dc5a45ef065945ecbd8b55be5279..28fda468626ce38c709786240c0bc13cfa584678 100644
--- a/lib/workers/repository/index.spec.ts
+++ b/lib/workers/repository/index.spec.ts
@@ -1,6 +1,6 @@
 import { mock } from 'jest-mock-extended';
 
-import { RenovateConfig, getConfig, getName, mocked } from '../../../test/util';
+import { RenovateConfig, getConfig, mocked } from '../../../test/util';
 import { setGlobalConfig } from '../../config/global';
 import * as _process from './process';
 import { ExtractResult } from './process/extract-update';
@@ -13,7 +13,7 @@ jest.mock('./process');
 jest.mock('./result');
 jest.mock('./error');
 
-describe(getName(), () => {
+describe('workers/repository/index', () => {
   describe('renovateRepository()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/init/apis.spec.ts b/lib/workers/repository/init/apis.spec.ts
index 1a7846d200c298bee62293ea2f3fa9c27436b675..b35f28d6f2e8b3cd0137ca87c5df66d4ebe56637 100644
--- a/lib/workers/repository/init/apis.spec.ts
+++ b/lib/workers/repository/init/apis.spec.ts
@@ -1,16 +1,11 @@
-import {
-  RenovateConfig,
-  getConfig,
-  getName,
-  platform,
-} from '../../../../test/util';
+import { RenovateConfig, getConfig, platform } from '../../../../test/util';
 import {
   REPOSITORY_DISABLED,
   REPOSITORY_FORKED,
 } from '../../../constants/error-messages';
 import { initApis } from './apis';
 
-describe(getName(), () => {
+describe('workers/repository/init/apis', () => {
   describe('initApis', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/init/cache.spec.ts b/lib/workers/repository/init/cache.spec.ts
index e808799ef87a37a6c18f227c1a8627bb25e3c77e..bb3de366992a898c23f4a564c91933f79b685d46 100644
--- a/lib/workers/repository/init/cache.spec.ts
+++ b/lib/workers/repository/init/cache.spec.ts
@@ -1,8 +1,8 @@
-import { RenovateConfig, getConfig, getName } from '../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import { initializeCaches } from './cache';
 
-describe(getName(), () => {
+describe('workers/repository/init/cache', () => {
   describe('initializeCaches()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/init/index.spec.ts b/lib/workers/repository/init/index.spec.ts
index 241e685e5311510fbd5794c04c9982bb066640e9..16b7e0bbe36987d6aa3bceade9b753d1c7610161 100644
--- a/lib/workers/repository/init/index.spec.ts
+++ b/lib/workers/repository/init/index.spec.ts
@@ -1,4 +1,4 @@
-import { getName, logger, mocked } from '../../../../test/util';
+import { logger, mocked } from '../../../../test/util';
 import { setGlobalConfig } from '../../../config/global';
 import * as _secrets from '../../../config/secrets';
 import * as _onboarding from '../onboarding/branch';
@@ -22,7 +22,7 @@ const merge = mocked(_merge);
 const onboarding = mocked(_onboarding);
 const secrets = mocked(_secrets);
 
-describe(getName(), () => {
+describe('workers/repository/init/index', () => {
   beforeEach(() => {
     setGlobalConfig({ localDir: '', cacheDir: '' });
   });
diff --git a/lib/workers/repository/init/merge.spec.ts b/lib/workers/repository/init/merge.spec.ts
index 6e456019098db191f337a9f3eeb6df696eedfa27..2fb761c2b186ef2b0bae561b96e715e9720e0eff 100644
--- a/lib/workers/repository/init/merge.spec.ts
+++ b/lib/workers/repository/init/merge.spec.ts
@@ -2,7 +2,6 @@ import {
   RenovateConfig,
   fs,
   getConfig,
-  getName,
   git,
   mocked,
   platform,
@@ -33,7 +32,7 @@ beforeEach(() => {
 jest.mock('../../../config/migration');
 jest.mock('../../../config/migrate-validate');
 
-describe(getName(), () => {
+describe('workers/repository/init/merge', () => {
   describe('detectRepoFileConfig()', () => {
     beforeEach(async () => {
       await initialize({});
diff --git a/lib/workers/repository/init/semantic.spec.ts b/lib/workers/repository/init/semantic.spec.ts
index e3be88d5c76334b01b7e46e992b96333dfc3bc33..c043f5b9e7cd24666f8f80f3d89302983870b328 100644
--- a/lib/workers/repository/init/semantic.spec.ts
+++ b/lib/workers/repository/init/semantic.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName, git } from '../../../../test/util';
+import { RenovateConfig, getConfig, git } from '../../../../test/util';
 import { initialize } from '../../../util/cache/repository';
 import { detectSemanticCommits } from './semantic';
 
@@ -12,7 +12,7 @@ beforeEach(() => {
   config.warnings = [];
 });
 
-describe(getName(), () => {
+describe('workers/repository/init/semantic', () => {
   describe('detectSemanticCommits()', () => {
     beforeEach(async () => {
       await initialize({});
diff --git a/lib/workers/repository/init/vulnerability.spec.ts b/lib/workers/repository/init/vulnerability.spec.ts
index 3bbfae3f1b02cdff1e99a788b4751535ec632089..c894e046eb5d48f68cf77bee3944e4764c418ff1 100644
--- a/lib/workers/repository/init/vulnerability.spec.ts
+++ b/lib/workers/repository/init/vulnerability.spec.ts
@@ -1,7 +1,6 @@
 import {
   RenovateConfig,
   defaultConfig,
-  getName,
   partial,
   platform,
 } from '../../../../test/util';
@@ -15,7 +14,7 @@ beforeEach(() => {
   config = JSON.parse(JSON.stringify(defaultConfig));
 });
 
-describe(getName(), () => {
+describe('workers/repository/init/vulnerability', () => {
   describe('detectVulnerabilityAlerts()', () => {
     it('returns if alerts are missing', async () => {
       delete config.vulnerabilityAlerts;
diff --git a/lib/workers/repository/model/commit-message.spec.ts b/lib/workers/repository/model/commit-message.spec.ts
index 9290af0bbabf45a6f949770e235e4b9b44aedddd..6c554934381c290c9fdc6205e61ba3cced4a6c39 100644
--- a/lib/workers/repository/model/commit-message.spec.ts
+++ b/lib/workers/repository/model/commit-message.spec.ts
@@ -1,7 +1,6 @@
-import { getName } from '../../../../test/util';
 import { CommitMessage } from './commit-message';
 
-describe(getName(), () => {
+describe('workers/repository/model/commit-message', () => {
   describe('CommitMessage', () => {
     const TEST_CASES: ReadonlyArray<
       [message: string, prefix: string | undefined, result: string]
diff --git a/lib/workers/repository/onboarding/branch/config.spec.ts b/lib/workers/repository/onboarding/branch/config.spec.ts
index caa8982abc124ff1d0025ad395dd48d7fb57905c..28eaacb6d801f3478b327a8e379efd188d887d1b 100644
--- a/lib/workers/repository/onboarding/branch/config.spec.ts
+++ b/lib/workers/repository/onboarding/branch/config.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName } from '../../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../../test/util';
 import * as presets from '../../../../config/presets/local';
 import { PRESET_DEP_NOT_FOUND } from '../../../../config/presets/util';
 import { getOnboardingConfig, getOnboardingConfigContents } from './config';
@@ -7,7 +7,7 @@ jest.mock('../../../../config/presets/local');
 
 const mockedPresets = presets as jest.Mocked<typeof presets>;
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/branch/config', () => {
   let config: RenovateConfig;
   beforeEach(() => {
     jest.clearAllMocks();
diff --git a/lib/workers/repository/onboarding/branch/create.spec.ts b/lib/workers/repository/onboarding/branch/create.spec.ts
index 3ea76b528a2f658e740a29a372c35e74c47fa0ad..342ed1a987b98859251a65858ca13cd9ea378863 100644
--- a/lib/workers/repository/onboarding/branch/create.spec.ts
+++ b/lib/workers/repository/onboarding/branch/create.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName } from '../../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../../test/util';
 import { commitFiles } from '../../../../util/git';
 import { CommitMessage } from '../../model/commit-message';
 import { createOnboardingBranch } from './create';
@@ -25,7 +25,7 @@ const buildExpectedCommitFilesArgument = (
   message,
 });
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/branch/create', () => {
   let config: RenovateConfig;
   beforeEach(() => {
     jest.clearAllMocks();
diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts
index dd151c063a0d8d1106aec9be69e773c817cb119c..951c969f79e420c411a8eeea305a6b958f8a05ef 100644
--- a/lib/workers/repository/onboarding/branch/index.spec.ts
+++ b/lib/workers/repository/onboarding/branch/index.spec.ts
@@ -3,7 +3,6 @@ import {
   RenovateConfig,
   fs,
   getConfig,
-  getName,
   git,
   mocked,
   platform,
@@ -30,7 +29,7 @@ jest.mock('./config');
 
 const cache = mocked(_cache);
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/branch/index', () => {
   describe('checkOnboardingBranch', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/onboarding/branch/rebase.spec.ts b/lib/workers/repository/onboarding/branch/rebase.spec.ts
index 52e12e6f4a738efe9c53350d66f2522349af56cc..4d3ea90d7d84a79179601dfa2aa6f1aa52c1c977 100644
--- a/lib/workers/repository/onboarding/branch/rebase.spec.ts
+++ b/lib/workers/repository/onboarding/branch/rebase.spec.ts
@@ -1,14 +1,9 @@
-import {
-  RenovateConfig,
-  defaultConfig,
-  getName,
-  git,
-} from '../../../../../test/util';
+import { RenovateConfig, defaultConfig, git } from '../../../../../test/util';
 import { rebaseOnboardingBranch } from './rebase';
 
 jest.mock('../../../../util/git');
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/branch/rebase', () => {
   describe('rebaseOnboardingBranch()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/onboarding/pr/base-branch.spec.ts b/lib/workers/repository/onboarding/pr/base-branch.spec.ts
index 107feb61e18ead260a95ae5ffabd4a9459032450..bd0993b32d895f4c7476721dbfdf3db700af0e28 100644
--- a/lib/workers/repository/onboarding/pr/base-branch.spec.ts
+++ b/lib/workers/repository/onboarding/pr/base-branch.spec.ts
@@ -1,8 +1,8 @@
-import { RenovateConfig, getConfig, getName } from '../../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../../test/util';
 
 import { getBaseBranchDesc } from './base-branch';
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/pr/base-branch', () => {
   describe('getBaseBranchDesc()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/onboarding/pr/config-description.spec.ts b/lib/workers/repository/onboarding/pr/config-description.spec.ts
index b91268a709df5b0ddbc4b79199d9707c91d18438..2229c6c4cc2ff8b0e2c7147493b27f5db58d3d54 100644
--- a/lib/workers/repository/onboarding/pr/config-description.spec.ts
+++ b/lib/workers/repository/onboarding/pr/config-description.spec.ts
@@ -1,8 +1,8 @@
-import { RenovateConfig, getConfig, getName } from '../../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../../test/util';
 import type { PackageFile } from '../../../../manager/types';
 import { getConfigDesc } from './config-description';
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/pr/config-description', () => {
   describe('getConfigDesc()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/onboarding/pr/errors-warnings.spec.ts b/lib/workers/repository/onboarding/pr/errors-warnings.spec.ts
index 9c31de703a0828a91e0f1f2b59f2d0fa176361db..7790cbd30704dd92ac5ff954c984528b53db834c 100644
--- a/lib/workers/repository/onboarding/pr/errors-warnings.spec.ts
+++ b/lib/workers/repository/onboarding/pr/errors-warnings.spec.ts
@@ -1,8 +1,8 @@
-import { RenovateConfig, getConfig, getName } from '../../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../../test/util';
 import type { PackageFile } from '../../../../manager/types';
 import { getDepWarnings, getErrors, getWarnings } from './errors-warnings';
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/pr/errors-warnings', () => {
   describe('getWarnings()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/onboarding/pr/index.spec.ts b/lib/workers/repository/onboarding/pr/index.spec.ts
index 4e9636ee420b66cf3969abf71f1301dd4e92d05b..caa5e23b1f4806d9d3b44adffdf3510f67d7bac2 100644
--- a/lib/workers/repository/onboarding/pr/index.spec.ts
+++ b/lib/workers/repository/onboarding/pr/index.spec.ts
@@ -1,7 +1,6 @@
 import {
   RenovateConfig,
   defaultConfig,
-  getName,
   git,
   partial,
   platform,
@@ -15,7 +14,7 @@ import { ensureOnboardingPr } from '.';
 
 jest.mock('../../../../util/git');
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/pr/index', () => {
   describe('ensureOnboardingPr()', () => {
     let config: RenovateConfig;
     let packageFiles: Record<string, PackageFile[]>;
diff --git a/lib/workers/repository/onboarding/pr/pr-list.spec.ts b/lib/workers/repository/onboarding/pr/pr-list.spec.ts
index b43d83470ccad0272c3e2d875ba86a5d47b747ea..7971514845a2ce003cde8e19b40ca5e4baebdd3e 100644
--- a/lib/workers/repository/onboarding/pr/pr-list.spec.ts
+++ b/lib/workers/repository/onboarding/pr/pr-list.spec.ts
@@ -1,8 +1,8 @@
-import { RenovateConfig, getConfig, getName } from '../../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../../test/util';
 import type { BranchConfig } from '../../../types';
 import { getPrList } from './pr-list';
 
-describe(getName(), () => {
+describe('workers/repository/onboarding/pr/pr-list', () => {
   describe('getPrList()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/process/deprecated.spec.ts b/lib/workers/repository/process/deprecated.spec.ts
index 869d02e5a34f87f517f8344b080bd9c74579b0eb..dd53179b765795faac374f4a3be8e1fd56ad9272 100644
--- a/lib/workers/repository/process/deprecated.spec.ts
+++ b/lib/workers/repository/process/deprecated.spec.ts
@@ -1,7 +1,7 @@
-import { RenovateConfig, getName, platform } from '../../../../test/util';
+import { RenovateConfig, platform } from '../../../../test/util';
 import { raiseDeprecationWarnings } from './deprecated';
 
-describe(getName(), () => {
+describe('workers/repository/process/deprecated', () => {
   describe('raiseDeprecationWarnings()', () => {
     it('returns if onboarding', async () => {
       const config = {};
diff --git a/lib/workers/repository/process/extract-update.spec.ts b/lib/workers/repository/process/extract-update.spec.ts
index 8d58060717a35808907e11382e855768879d706f..ae98f5efbaa015925a4eee8692e618ef3f3e68f3 100644
--- a/lib/workers/repository/process/extract-update.spec.ts
+++ b/lib/workers/repository/process/extract-update.spec.ts
@@ -1,5 +1,5 @@
 import hasha from 'hasha';
-import { getName, git, mocked } from '../../../../test/util';
+import { git, mocked } from '../../../../test/util';
 import type { PackageFile } from '../../../manager/types';
 import * as _repositoryCache from '../../../util/cache/repository';
 import * as _branchify from '../updates/branchify';
@@ -21,7 +21,7 @@ branchify.branchifyUpgrades.mockResolvedValueOnce({
   branchList: ['branchName'],
 });
 
-describe(getName(), () => {
+describe('workers/repository/process/extract-update', () => {
   describe('extract()', () => {
     it('runs with no baseBranches', async () => {
       const config = {
diff --git a/lib/workers/repository/process/fetch.spec.ts b/lib/workers/repository/process/fetch.spec.ts
index 988a782264ad22b059d54ab7089f3613393ec17d..25b9e901a49f2083718bad88404d62235d1a09e9 100644
--- a/lib/workers/repository/process/fetch.spec.ts
+++ b/lib/workers/repository/process/fetch.spec.ts
@@ -1,9 +1,4 @@
-import {
-  RenovateConfig,
-  getConfig,
-  getName,
-  mocked,
-} from '../../../../test/util';
+import { RenovateConfig, getConfig, mocked } from '../../../../test/util';
 import * as datasourceMaven from '../../../datasource/maven';
 import type { PackageFile } from '../../../manager/types';
 import { fetchUpdates } from './fetch';
@@ -13,7 +8,7 @@ const lookupUpdates = mocked(lookup).lookupUpdates;
 
 jest.mock('./lookup');
 
-describe(getName(), () => {
+describe('workers/repository/process/fetch', () => {
   describe('fetchUpdates()', () => {
     let config: RenovateConfig;
     beforeEach(() => {
diff --git a/lib/workers/repository/process/index.spec.ts b/lib/workers/repository/process/index.spec.ts
index ff88cc5c70eada14199102758ae11d6848a415e7..63a53900e6f9063a99c319dd37da0336cf22c630 100644
--- a/lib/workers/repository/process/index.spec.ts
+++ b/lib/workers/repository/process/index.spec.ts
@@ -1,10 +1,4 @@
-import {
-  RenovateConfig,
-  getConfig,
-  getName,
-  git,
-  mocked,
-} from '../../../../test/util';
+import { RenovateConfig, getConfig, git, mocked } from '../../../../test/util';
 import * as _extractUpdate from './extract-update';
 import { extractDependencies, updateRepo } from '.';
 
@@ -19,7 +13,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('workers/repository/process/index', () => {
   describe('processRepo()', () => {
     it('processes single branches', async () => {
       const res = await extractDependencies(config);
diff --git a/lib/workers/repository/process/limits.spec.ts b/lib/workers/repository/process/limits.spec.ts
index fe6f7c982db9503460bc8b0e51e6558cfb8b9b75..7f1128ea90ceeef49bd9b5d2cc6731ca9c0df1a0 100644
--- a/lib/workers/repository/process/limits.spec.ts
+++ b/lib/workers/repository/process/limits.spec.ts
@@ -2,7 +2,6 @@ import { DateTime } from 'luxon';
 import {
   RenovateConfig,
   getConfig,
-  getName,
   git,
   platform,
 } from '../../../../test/util';
@@ -18,7 +17,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('workers/repository/process/limits', () => {
   describe('getPrHourlyRemaining()', () => {
     it('calculates hourly limit remaining', async () => {
       const time = DateTime.local();
diff --git a/lib/workers/repository/process/lookup/filter-checks.spec.ts b/lib/workers/repository/process/lookup/filter-checks.spec.ts
index fd63fe53c3ab2d86876a7ed3c108a9bfc5caf071..7ab19a7a28573c42cd26e4064b0870fb3f6384d9 100644
--- a/lib/workers/repository/process/lookup/filter-checks.spec.ts
+++ b/lib/workers/repository/process/lookup/filter-checks.spec.ts
@@ -1,4 +1,4 @@
-import { getConfig, getName, mocked } from '../../../../../test/util';
+import { getConfig, mocked } from '../../../../../test/util';
 import type { Release } from '../../../../datasource';
 import { clone } from '../../../../util/clone';
 import * as _dateUtil from '../../../../util/date';
@@ -36,7 +36,7 @@ const releases: Release[] = [
   },
 ];
 
-describe(getName(), () => {
+describe('workers/repository/process/lookup/filter-checks', () => {
   let sortedReleases: Release[];
   beforeEach(() => {
     config = getConfig();
diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts
index add2ba3e2d53681f4a328605019f5ab8c1f51f82..e47571fe33a61ced68b54005a568be20b9bb4399 100644
--- a/lib/workers/repository/process/lookup/index.spec.ts
+++ b/lib/workers/repository/process/lookup/index.spec.ts
@@ -1,7 +1,6 @@
 import * as httpMock from '../../../../../test/http-mock';
 import {
   getConfig,
-  getName,
   loadJsonFixture,
   mocked,
   partial,
@@ -49,7 +48,7 @@ Object.assign(githubReleases, { defaultRegistryUrls: ['https://github.com'] });
 
 let config: LookupUpdateConfig;
 
-describe(getName(), () => {
+describe('workers/repository/process/lookup/index', () => {
   beforeEach(() => {
     // TODO: fix types
     config = partial<LookupUpdateConfig>(getConfig());
diff --git a/lib/workers/repository/process/sort.spec.ts b/lib/workers/repository/process/sort.spec.ts
index 2e1803ba07dda752d1833013295385212731c6be..17558593fb9cc885f35436e764c789d7b4ff430f 100644
--- a/lib/workers/repository/process/sort.spec.ts
+++ b/lib/workers/repository/process/sort.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../../test/util';
 import type { UpdateType } from '../../../config/types';
 import { sortBranches } from './sort';
 
-describe(getName(), () => {
+describe('workers/repository/process/sort', () => {
   describe('sortBranches()', () => {
     it('sorts based on updateType and prTitle', () => {
       const branches = [
diff --git a/lib/workers/repository/process/write.spec.ts b/lib/workers/repository/process/write.spec.ts
index 1e40134c729de9e95c3471da18ad2188a008a34f..5b57436fd477b84bb731b96c741cd0e2b7b3b832 100644
--- a/lib/workers/repository/process/write.spec.ts
+++ b/lib/workers/repository/process/write.spec.ts
@@ -1,10 +1,4 @@
-import {
-  RenovateConfig,
-  getConfig,
-  getName,
-  git,
-  mocked,
-} from '../../../../test/util';
+import { RenovateConfig, getConfig, git, mocked } from '../../../../test/util';
 import * as _branchWorker from '../../branch';
 import { Limit, isLimitReached } from '../../global/limits';
 import { BranchConfig, BranchResult } from '../../types';
@@ -27,7 +21,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('workers/repository/process/write', () => {
   describe('writeUpdates()', () => {
     it('stops after automerge', async () => {
       const branches: BranchConfig[] = [
diff --git a/lib/workers/repository/result.spec.ts b/lib/workers/repository/result.spec.ts
index 781bcc717ffaf30bd8737a9f46c7152487af3ac1..1966de1cef4d49d13b72de317551aca70476c437 100644
--- a/lib/workers/repository/result.spec.ts
+++ b/lib/workers/repository/result.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName } from '../../../test/util';
+import { RenovateConfig, getConfig } from '../../../test/util';
 import { processResult } from './result';
 
 let config: RenovateConfig;
@@ -7,7 +7,7 @@ beforeEach(() => {
   config = getConfig();
 });
 
-describe(getName(), () => {
+describe('workers/repository/result', () => {
   describe('processResult()', () => {
     it('runs', () => {
       const result = processResult(config, 'done');
diff --git a/lib/workers/repository/stats.spec.ts b/lib/workers/repository/stats.spec.ts
index 4408d53dae0e4276f0b79e6b5cea91b0c1b10a66..a62796aa981944b6c0ae9ba7d567eff8f99dccb3 100644
--- a/lib/workers/repository/stats.spec.ts
+++ b/lib/workers/repository/stats.spec.ts
@@ -1,4 +1,3 @@
-import { getName } from '../../../test/util';
 import * as memCache_ from '../../util/cache/memory';
 import { printRequestStats } from './stats';
 
@@ -6,7 +5,7 @@ jest.mock('../../util/cache/memory');
 
 const memCache: any = memCache_ as any;
 
-describe(getName(), () => {
+describe('workers/repository/stats', () => {
   describe('printRequestStats()', () => {
     it('runs', () => {
       memCache.get = jest.fn(() => [
diff --git a/lib/workers/repository/updates/branch-name.spec.ts b/lib/workers/repository/updates/branch-name.spec.ts
index 115b60c7b1263cf31e08ba141a809348c8537f11..15ca57ac5cc9cc31fbe2b905845f500a075747c7 100644
--- a/lib/workers/repository/updates/branch-name.spec.ts
+++ b/lib/workers/repository/updates/branch-name.spec.ts
@@ -1,8 +1,7 @@
-import { getName } from '../../../../test/util';
 import type { RenovateConfig } from '../../../config/types';
 import { generateBranchName } from './branch-name';
 
-describe(getName(), () => {
+describe('workers/repository/updates/branch-name', () => {
   describe('getBranchName()', () => {
     it('uses groupName if no slug defined', () => {
       const upgrade: RenovateConfig = {
diff --git a/lib/workers/repository/updates/branchify.spec.ts b/lib/workers/repository/updates/branchify.spec.ts
index 8a5fd948866f90a708c417a72d2ce088d0e92d86..37ec32683888e4c4d7c01648c5f3fbf3a3516fda 100644
--- a/lib/workers/repository/updates/branchify.spec.ts
+++ b/lib/workers/repository/updates/branchify.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getName, mocked } from '../../../../test/util';
+import { RenovateConfig, mocked } from '../../../../test/util';
 import { getConfig } from '../../../config/defaults';
 import * as _changelog from '../changelog';
 import { branchifyUpgrades } from './branchify';
@@ -18,7 +18,7 @@ beforeEach(() => {
   config.warnings = [];
 });
 
-describe(getName(), () => {
+describe('workers/repository/updates/branchify', () => {
   describe('branchifyUpgrades()', () => {
     it('returns empty', async () => {
       flattenUpdates.mockResolvedValueOnce([]);
diff --git a/lib/workers/repository/updates/flatten.spec.ts b/lib/workers/repository/updates/flatten.spec.ts
index 984673ed059acb79b6922b56073c6cc3455df358..4db3fec1510f9bb726ae1d80e52af28d7b47dcf6 100644
--- a/lib/workers/repository/updates/flatten.spec.ts
+++ b/lib/workers/repository/updates/flatten.spec.ts
@@ -1,4 +1,4 @@
-import { RenovateConfig, getConfig, getName } from '../../../../test/util';
+import { RenovateConfig, getConfig } from '../../../../test/util';
 
 import { LANGUAGE_DOCKER } from '../../../constants/languages';
 import { flattenUpdates } from './flatten';
@@ -11,7 +11,7 @@ beforeEach(() => {
   config.warnings = [];
 });
 
-describe(getName(), () => {
+describe('workers/repository/updates/flatten', () => {
   describe('flattenUpdates()', () => {
     it('flattens', async () => {
       config.lockFileMaintenance.enabled = true;
diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts
index 0b0fb7eccbae58e90c0455ab7121889f8fbab9f7..bc6cdbd97f55d5b0d783955f87de71e908d11b4a 100644
--- a/lib/workers/repository/updates/generate.spec.ts
+++ b/lib/workers/repository/updates/generate.spec.ts
@@ -1,4 +1,4 @@
-import { defaultConfig, getName, partial } from '../../../../test/util';
+import { defaultConfig, partial } from '../../../../test/util';
 import type { UpdateType } from '../../../config/types';
 import * as datasourceNpm from '../../../datasource/npm';
 import type { BranchUpgradeConfig } from '../../types';
@@ -8,7 +8,7 @@ beforeEach(() => {
   jest.resetAllMocks();
 });
 
-describe(getName(), () => {
+describe('workers/repository/updates/generate', () => {
   describe('generateBranchConfig()', () => {
     it('does not group single upgrade', () => {
       const branch = [
diff --git a/package.json b/package.json
index db9bba8946b28b4a097e573a7a1b57f51ceecccc..183b0999220ded4435d7b512f4c500e6fa9fa241 100644
--- a/package.json
+++ b/package.json
@@ -202,6 +202,7 @@
     "@jest/reporters": "27.0.6",
     "@jest/test-result": "27.0.6",
     "@ls-lint/ls-lint": "1.10.0",
+    "@renovate/eslint-plugin": "https://github.com/renovatebot/eslint-plugin#v0.0.3",
     "@semantic-release/exec": "5.0.0",
     "@types/bunyan": "1.8.7",
     "@types/cacache": "15.0.1",
diff --git a/test/util.ts b/test/util.ts
index 868fa0f0484a9dcb73fc3f21311ce8817be314c0..ab90bbbf2a463c5f43249bea1d73af25ac856334 100644
--- a/test/util.ts
+++ b/test/util.ts
@@ -75,12 +75,6 @@ function getCallerFileName(): string | null {
   return result;
 }
 
-export function getName(): string {
-  const file = getCallerFileName();
-  const [, name] = /lib\/(.*?)\.spec\.ts$/.exec(file.replace(/\\/g, '/'));
-  return name;
-}
-
 export function getFixturePath(fixtureFile: string, fixtureRoot = '.'): string {
   const callerDir = upath.dirname(getCallerFileName());
   return upath.join(callerDir, fixtureRoot, '__fixtures__', fixtureFile);
diff --git a/test/website-docs.spec.ts b/test/website-docs.spec.ts
index 05792120fbf55679cf160d8da2933a2cd1c54d66..8b8f542cf373ee7755b91ce799ea3f4cd03e6783 100644
--- a/test/website-docs.spec.ts
+++ b/test/website-docs.spec.ts
@@ -18,7 +18,7 @@ declare global {
 
 const options = getOptions();
 
-describe('docs', () => {
+describe('website-docs', () => {
   const doc = fs.readFileSync('docs/usage/configuration-options.md', 'utf8');
   const selfHostDoc = fs.readFileSync(
     'docs/usage/self-hosted-configuration.md',
diff --git a/yarn.lock b/yarn.lock
index 78dc4419c2f99bbbc9b4969783d22babd353b127..4748298b20fa8ccafcf02a7b4734d695dc347d2d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1469,6 +1469,10 @@
   dependencies:
     "@octokit/openapi-types" "^9.5.0"
 
+"@renovate/eslint-plugin@https://github.com/renovatebot/eslint-plugin#v0.0.3":
+  version "0.0.1"
+  resolved "https://github.com/renovatebot/eslint-plugin#c88253170ce9e9248bc0653197ed2ff1ecf41ac1"
+
 "@renovate/pep440@1.0.0":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@renovate/pep440/-/pep440-1.0.0.tgz#9e05cac649b6a3d027cba7f2939b085de78f39ea"