From b2552756323d46f99b3c63bb228e7d7b5cc1a8b1 Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Fri, 23 Apr 2021 20:58:48 +0400
Subject: [PATCH] refactor(test): Load fixtures with helpers (#9699)

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
---
 lib/config/decrypt.spec.ts                    |  5 +-
 lib/config/presets/index.spec.ts              |  8 +-
 lib/datasource/cdnjs/index.spec.ts            | 16 +---
 lib/datasource/crate/index.spec.ts            | 11 +--
 lib/datasource/dart/index.spec.ts             | 10 +--
 .../galaxy-collection/index.spec.ts           | 33 ++++----
 lib/datasource/galaxy/index.spec.ts           | 13 +---
 lib/datasource/git-refs/index.spec.ts         |  8 +-
 lib/datasource/git-tags/index.spec.ts         |  8 +-
 lib/datasource/gradle-version/index.spec.ts   | 14 +---
 lib/datasource/helm/index.spec.ts             |  8 +-
 lib/datasource/hex/index.spec.ts              |  9 +--
 lib/datasource/jenkins-plugins/index.spec.ts  | 13 +++-
 lib/datasource/maven/index.spec.ts            | 22 ++----
 lib/datasource/nuget/index.spec.ts            | 76 +++++--------------
 lib/datasource/packagist/index.spec.ts        | 35 +++------
 lib/datasource/pypi/index.spec.ts             | 29 +++----
 lib/datasource/repology/index.spec.ts         | 28 ++-----
 lib/datasource/ruby-version/index.spec.ts     |  8 +-
 .../rubygems/__fixtures__/rubygems-org.txt    | 18 +++++
 lib/datasource/rubygems/index.spec.ts         | 25 +-----
 lib/datasource/sbt-package/index.spec.ts      | 15 +---
 lib/datasource/sbt-plugin/index.spec.ts       | 15 +---
 lib/datasource/terraform-module/index.spec.ts | 17 ++---
 .../terraform-provider/index.spec.ts          | 17 ++---
 lib/manager/ansible-galaxy/extract.spec.ts    | 33 ++------
 lib/manager/ansible/extract.spec.ts           | 13 +---
 lib/manager/azure-pipelines/extract.spec.ts   | 20 ++---
 lib/manager/batect-wrapper/extract.spec.ts    | 14 +---
 lib/manager/bazel/extract.spec.ts             | 26 ++-----
 lib/manager/bazel/update.spec.ts              | 21 +----
 lib/manager/buildkite/extract.spec.ts         | 23 ++----
 lib/manager/bundler/extract.spec.ts           | 76 +++++--------------
 lib/manager/bundler/gemfile.spec.ts           |  8 +-
 lib/manager/bundler/locked-version.spec.ts    | 29 +++----
 lib/manager/cake/index.spec.ts                |  8 +-
 lib/manager/cargo/extract.spec.ts             | 39 ++--------
 lib/manager/cdnurl/extract.spec.ts            |  9 +--
 lib/manager/circleci/extract.spec.ts          | 18 +----
 lib/manager/cloudbuild/extract.spec.ts        |  8 +-
 lib/manager/cocoapods/extract.spec.ts         | 16 +---
 lib/manager/composer/extract.spec.ts          | 33 ++------
 lib/manager/deps-edn/extract.spec.ts          | 10 +--
 lib/manager/docker-compose/extract.spec.ts    | 21 ++---
 lib/manager/dockerfile/extract.spec.ts        | 14 +---
 lib/manager/droneci/extract.spec.ts           |  9 +--
 lib/manager/github-actions/extract.spec.ts    | 14 +---
 lib/manager/gitlabci-include/extract.spec.ts  |  8 +-
 lib/manager/gomod/extract.spec.ts             |  9 +--
 lib/manager/gomod/update.spec.ts              |  7 +-
 lib/manager/gradle-lite/parser.spec.ts        | 14 ++--
 lib/manager/gradle-wrapper/extract.spec.ts    | 30 ++------
 lib/manager/helm-values/extract.spec.ts       | 15 ++--
 lib/manager/helmfile/extract.spec.ts          |  9 +--
 lib/manager/homebrew/extract.spec.ts          | 25 ++----
 lib/manager/homebrew/update.spec.ts           | 13 +---
 lib/manager/html/extract.spec.ts              | 14 +---
 lib/manager/jenkins/extract.spec.ts           | 32 ++------
 lib/manager/kubernetes/extract.spec.ts        | 26 ++-----
 lib/manager/kustomize/extract.spec.ts         | 54 +++----------
 lib/manager/leiningen/extract.spec.ts         | 10 +--
 lib/manager/maven/extract.spec.ts             | 15 +---
 lib/manager/maven/index.spec.ts               | 23 ++----
 lib/manager/meteor/extract.spec.ts            | 10 +--
 lib/manager/mix/extract.spec.ts               |  9 +--
 lib/manager/npm/extract/index.spec.ts         | 29 ++++---
 lib/manager/npm/extract/npm.spec.ts           | 13 ++--
 lib/manager/npm/extract/yarn.spec.ts          | 20 ++---
 .../npm/update/dependency/index.spec.ts       | 12 +--
 .../locked-dependency/dep-constraints.spec.ts | 12 +--
 .../locked-dependency/get-locked.spec.ts      |  8 +-
 .../update/locked-dependency/index.spec.ts    | 42 +++-------
 .../locked-dependency/parent-version.spec.ts  |  8 +-
 lib/manager/pip_requirements/extract.spec.ts  | 42 ++--------
 .../__snapshots__/index.spec.ts.snap          |  8 +-
 lib/manager/pip_setup/index.spec.ts           | 11 +--
 lib/manager/pipenv/extract.spec.ts            | 28 ++-----
 lib/manager/poetry/artifacts.spec.ts          |  8 +-
 lib/manager/poetry/extract.spec.ts            | 68 +++--------------
 lib/manager/pre-commit/extract.spec.ts        | 45 +++++------
 lib/manager/pub/extract.spec.ts               | 14 +---
 lib/manager/regex/index.spec.ts               | 19 +----
 lib/manager/sbt/extract.spec.ts               | 34 +++------
 lib/manager/setup-cfg/extract.spec.ts         |  8 +-
 lib/manager/swift/index.spec.ts               |  9 +--
 lib/manager/terraform/extract.spec.ts         |  7 +-
 lib/manager/terragrunt/extract.spec.ts        |  5 +-
 lib/manager/travis/extract.spec.ts            |  9 +--
 lib/manager/travis/update.spec.ts             |  9 +--
 lib/platform/github/index.spec.ts             | 15 ++--
 lib/platform/utils/pr-body.spec.ts            | 12 +--
 .../utils/read-only-issue-body.spec.ts        | 12 +--
 lib/workers/branch/auto-replace.spec.ts       |  9 +--
 .../pr/changelog/release-notes.spec.ts        | 41 ++++------
 .../repository/dependency-dashboard.spec.ts   | 27 ++-----
 .../repository/process/lookup/index.spec.ts   | 35 ++++++---
 test/util.ts                                  | 26 +++++++
 97 files changed, 573 insertions(+), 1318 deletions(-)
 create mode 100644 lib/datasource/rubygems/__fixtures__/rubygems-org.txt

diff --git a/lib/config/decrypt.spec.ts b/lib/config/decrypt.spec.ts
index f0f604e60a..c79072a515 100644
--- a/lib/config/decrypt.spec.ts
+++ b/lib/config/decrypt.spec.ts
@@ -1,10 +1,9 @@
-import fs from 'fs';
-import { getName } from '../../test/util';
+import { getName, loadFixture } from '../../test/util';
 import { setAdminConfig } from './admin';
 import { decryptConfig } from './decrypt';
 import type { RenovateConfig } from './types';
 
-const privateKey = fs.readFileSync('lib/config/keys/__fixtures__/private.pem');
+const privateKey = loadFixture(__filename, 'private.pem', 'keys');
 
 describe(getName(__filename), () => {
   describe('decryptConfig()', () => {
diff --git a/lib/config/presets/index.spec.ts b/lib/config/presets/index.spec.ts
index 08acc21349..38e7e4f982 100644
--- a/lib/config/presets/index.spec.ts
+++ b/lib/config/presets/index.spec.ts
@@ -1,6 +1,5 @@
-import { getName, mocked } from '../../../test/util';
+import { getName, loadJsonFixture, mocked } from '../../../test/util';
 import type { RenovateConfig } from '../types';
-import presetIkatyang from './__fixtures__/renovate-config-ikatyang.json';
 import * as _local from './local';
 import * as _npm from './npm';
 import {
@@ -17,6 +16,11 @@ jest.mock('./local');
 const npm = mocked(_npm);
 const local = mocked(_local);
 
+const presetIkatyang = loadJsonFixture(
+  __filename,
+  'renovate-config-ikatyang.json'
+);
+
 npm.getPreset = jest.fn(({ packageName, presetName }) => {
   if (packageName === 'renovate-config-ikatyang') {
     return presetIkatyang.versions[presetIkatyang['dist-tags'].latest][
diff --git a/lib/datasource/cdnjs/index.spec.ts b/lib/datasource/cdnjs/index.spec.ts
index 8535027de5..6e6165ee1f 100644
--- a/lib/datasource/cdnjs/index.spec.ts
+++ b/lib/datasource/cdnjs/index.spec.ts
@@ -1,21 +1,11 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { id as datasource } from '.';
 
-let res1 = fs.readFileSync(
-  'lib/datasource/cdnjs/__fixtures__/d3-force.json',
-  'utf8'
-);
-res1 = JSON.parse(res1);
-
-let res2 = fs.readFileSync(
-  'lib/datasource/cdnjs/__fixtures__/bulma.json',
-  'utf8'
-);
-res2 = JSON.parse(res2);
+const res1 = loadFixture(__filename, 'd3-force.json');
+const res2 = loadFixture(__filename, 'bulma.json');
 
 const baseUrl = 'https://api.cdnjs.com/';
 
diff --git a/lib/datasource/crate/index.spec.ts b/lib/datasource/crate/index.spec.ts
index dd8e79fdef..8bcf8fe19c 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 } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { setAdminConfig } from '../../config/admin';
 import * as memCache from '../../util/cache/memory';
 import { setFsConfig } from '../../util/fs';
@@ -20,12 +20,9 @@ import {
 jest.mock('simple-git');
 const simpleGit: any = _simpleGit;
 
-const res1 = fs.readFileSync('lib/datasource/crate/__fixtures__/libc', 'utf8');
-const res2 = fs.readFileSync(
-  'lib/datasource/crate/__fixtures__/amethyst',
-  'utf8'
-);
-const res3 = fs.readFileSync('lib/datasource/crate/__fixtures__/mypkg', 'utf8');
+const res1 = loadFixture(__filename, 'libc');
+const res2 = loadFixture(__filename, 'amethyst');
+const res3 = loadFixture(__filename, 'mypkg');
 
 const baseUrl =
   'https://raw.githubusercontent.com/rust-lang/crates.io-index/master/';
diff --git a/lib/datasource/dart/index.spec.ts b/lib/datasource/dart/index.spec.ts
index 5228b332bf..abc986a028 100644
--- a/lib/datasource/dart/index.spec.ts
+++ b/lib/datasource/dart/index.spec.ts
@@ -1,15 +1,9 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadJsonFixture } from '../../../test/util';
 import { id as datasource } from '.';
 
-const body: any = JSON.parse(
-  fs.readFileSync(
-    'lib/datasource/dart/__fixtures__/shared_preferences.json',
-    'utf8'
-  )
-);
+const body = loadJsonFixture(__filename, 'shared_preferences.json');
 
 const baseUrl = 'https://pub.dartlang.org/api/packages/';
 
diff --git a/lib/datasource/galaxy-collection/index.spec.ts b/lib/datasource/galaxy-collection/index.spec.ts
index b7583d605d..32acd8d69a 100644
--- a/lib/datasource/galaxy-collection/index.spec.ts
+++ b/lib/datasource/galaxy-collection/index.spec.ts
@@ -1,29 +1,28 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 
 import { id as datasource } from '.';
 
-const communityKubernetesBase = fs.readFileSync(
-  'lib/datasource/galaxy-collection/__fixtures__/community_kubernetes_base.json',
-  'utf8'
+const communityKubernetesBase = loadFixture(
+  __filename,
+  'community_kubernetes_base.json'
 );
-const communityKubernetesVersions = fs.readFileSync(
-  'lib/datasource/galaxy-collection/__fixtures__/community_kubernetes_versions.json',
-  'utf8'
+const communityKubernetesVersions = loadFixture(
+  __filename,
+  'community_kubernetes_versions.json'
 );
-const communityKubernetesDetails121 = fs.readFileSync(
-  'lib/datasource/galaxy-collection/__fixtures__/community_kubernetes_version_details_1.2.1.json',
-  'utf8'
+const communityKubernetesDetails121 = loadFixture(
+  __filename,
+  'community_kubernetes_version_details_1.2.1.json'
 );
-const communityKubernetesDetails120 = fs.readFileSync(
-  'lib/datasource/galaxy-collection/__fixtures__/community_kubernetes_version_details_1.2.0.json',
-  'utf8'
+const communityKubernetesDetails120 = loadFixture(
+  __filename,
+  'community_kubernetes_version_details_1.2.0.json'
 );
-const communityKubernetesDetails0111 = fs.readFileSync(
-  'lib/datasource/galaxy-collection/__fixtures__/community_kubernetes_version_details_0.11.1.json',
-  'utf8'
+const communityKubernetesDetails0111 = loadFixture(
+  __filename,
+  'community_kubernetes_version_details_0.11.1.json'
 );
 
 const baseUrl = 'https://galaxy.ansible.com';
diff --git a/lib/datasource/galaxy/index.spec.ts b/lib/datasource/galaxy/index.spec.ts
index 6fb5451118..4786daa728 100644
--- a/lib/datasource/galaxy/index.spec.ts
+++ b/lib/datasource/galaxy/index.spec.ts
@@ -1,18 +1,11 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 
 import { id as datasource } from '.';
 
-const res1 = fs.readFileSync(
-  'lib/datasource/galaxy/__fixtures__/timezone',
-  'utf8'
-);
-const empty = fs.readFileSync(
-  'lib/datasource/galaxy/__fixtures__/empty',
-  'utf8'
-);
+const res1 = loadFixture(__filename, 'timezone');
+const empty = loadFixture(__filename, 'empty');
 
 const baseUrl = 'https://galaxy.ansible.com/';
 
diff --git a/lib/datasource/git-refs/index.spec.ts b/lib/datasource/git-refs/index.spec.ts
index c60b8eb241..5e0dc5c31f 100644
--- a/lib/datasource/git-refs/index.spec.ts
+++ b/lib/datasource/git-refs/index.spec.ts
@@ -1,7 +1,6 @@
-import fs from 'fs-extra';
 import _simpleGit from 'simple-git';
 import { getPkgReleases } from '..';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { id as datasource, getDigest } from '.';
 
 jest.mock('simple-git');
@@ -9,10 +8,7 @@ const simpleGit: any = _simpleGit;
 
 const depName = 'https://github.com/example/example.git';
 
-const lsRemote1 = fs.readFileSync(
-  'lib/datasource/git-refs/__fixtures__/ls-remote-1.txt',
-  'utf8'
-);
+const lsRemote1 = loadFixture(__filename, 'ls-remote-1.txt');
 
 describe(getName(__filename), () => {
   describe('getReleases', () => {
diff --git a/lib/datasource/git-tags/index.spec.ts b/lib/datasource/git-tags/index.spec.ts
index c449c78d42..d1309fa51d 100644
--- a/lib/datasource/git-tags/index.spec.ts
+++ b/lib/datasource/git-tags/index.spec.ts
@@ -1,7 +1,6 @@
-import fs from 'fs-extra';
 import _simpleGit from 'simple-git';
 import { getPkgReleases } from '..';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { id as datasource, getDigest } from '.';
 
 jest.mock('simple-git');
@@ -9,10 +8,7 @@ const simpleGit: any = _simpleGit;
 
 const depName = 'https://github.com/example/example.git';
 
-const lsRemote1 = fs.readFileSync(
-  'lib/datasource/git-refs/__fixtures__/ls-remote-1.txt',
-  'utf8'
-);
+const lsRemote1 = loadFixture(__filename, 'ls-remote-1.txt', '../git-refs');
 
 describe(getName(__filename), () => {
   describe('getReleases', () => {
diff --git a/lib/datasource/gradle-version/index.spec.ts b/lib/datasource/gradle-version/index.spec.ts
index fc9ac0b290..dd527dc0e1 100644
--- a/lib/datasource/gradle-version/index.spec.ts
+++ b/lib/datasource/gradle-version/index.spec.ts
@@ -1,14 +1,11 @@
-import fs from 'fs';
 import { GetPkgReleasesConfig, GetReleasesConfig, getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName, partial } from '../../../test/util';
+import { getName, loadJsonFixture, partial } from '../../../test/util';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import { id as versioning } from '../../versioning/gradle';
 import { id as datasource, getReleases } from '.';
 
-const allResponse: any = fs.readFileSync(
-  'lib/datasource/gradle-version/__fixtures__/all.json'
-);
+const allResponse: any = loadJsonFixture(__filename, 'all.json');
 
 let config: GetPkgReleasesConfig;
 
@@ -32,7 +29,7 @@ describe(getName(__filename), () => {
       httpMock
         .scope('https://services.gradle.org/')
         .get('/versions/all')
-        .reply(200, JSON.parse(allResponse));
+        .reply(200, allResponse);
       const res = await getPkgReleases(config);
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -44,10 +41,7 @@ describe(getName(__filename), () => {
     });
 
     it('calls configured registryUrls', async () => {
-      httpMock
-        .scope('https://foo.bar')
-        .get('/')
-        .reply(200, JSON.parse(allResponse));
+      httpMock.scope('https://foo.bar').get('/').reply(200, allResponse);
 
       httpMock
         .scope('http://baz.qux')
diff --git a/lib/datasource/helm/index.spec.ts b/lib/datasource/helm/index.spec.ts
index 5e57299025..37e9a11920 100644
--- a/lib/datasource/helm/index.spec.ts
+++ b/lib/datasource/helm/index.spec.ts
@@ -1,14 +1,10 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { id as datasource } from '.';
 
 // Truncated index.yaml file
-const indexYaml = fs.readFileSync(
-  'lib/datasource/helm/__fixtures__/index.yaml',
-  'utf8'
-);
+const indexYaml = loadFixture(__filename, 'index.yaml');
 
 describe(getName(__filename), () => {
   describe('getReleases', () => {
diff --git a/lib/datasource/hex/index.spec.ts b/lib/datasource/hex/index.spec.ts
index 44f72778b8..4357cf966f 100644
--- a/lib/datasource/hex/index.spec.ts
+++ b/lib/datasource/hex/index.spec.ts
@@ -1,18 +1,13 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadJsonFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import * as _hostRules from '../../util/host-rules';
 import { id as datasource } from '.';
 
 const hostRules: any = _hostRules;
 
-let res1 = fs.readFileSync(
-  'lib/datasource/hex/__fixtures__/certifi.json',
-  'utf8'
-);
-res1 = JSON.parse(res1);
+const res1 = loadJsonFixture(__filename, 'certifi.json');
 
 jest.mock('../../util/host-rules');
 
diff --git a/lib/datasource/jenkins-plugins/index.spec.ts b/lib/datasource/jenkins-plugins/index.spec.ts
index 8de09d6688..3943760e88 100644
--- a/lib/datasource/jenkins-plugins/index.spec.ts
+++ b/lib/datasource/jenkins-plugins/index.spec.ts
@@ -1,12 +1,19 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadJsonFixture } from '../../../test/util';
 import * as versioning from '../../versioning/docker';
-import jenkinsPluginsVersions from './__fixtures__/plugin-versions.json';
-import jenkinsPluginsInfo from './__fixtures__/update-center.actual.json';
 import { resetCache } from './get';
 import * as jenkins from '.';
 
+const jenkinsPluginsVersions = loadJsonFixture(
+  __filename,
+  'plugin-versions.json'
+);
+const jenkinsPluginsInfo = loadJsonFixture(
+  __filename,
+  'update-center.actual.json'
+);
+
 describe(getName(__filename), () => {
   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 9eb446dbf8..9a411bb8e2 100644
--- a/lib/datasource/maven/index.spec.ts
+++ b/lib/datasource/maven/index.spec.ts
@@ -1,8 +1,6 @@
-import fs from 'fs';
 import nock from 'nock';
-import { resolve } from 'upath';
 import { Release, getPkgReleases } from '..';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import * as hostRules from '../../util/host-rules';
 import * as mavenVersioning from '../../versioning/maven';
@@ -10,20 +8,14 @@ import { id as datasource } from '.';
 
 const MYSQL_VERSIONS = ['6.0.5', '6.0.6', '8.0.7', '8.0.8', '8.0.9'];
 
-const MYSQL_MAVEN_METADATA = fs.readFileSync(
-  resolve(
-    __dirname,
-    './__fixtures__/repo1.maven.org/maven2/mysql/mysql-connector-java/maven-metadata.xml'
-  ),
-  'utf8'
+const MYSQL_MAVEN_METADATA = loadFixture(
+  __filename,
+  'repo1.maven.org/maven2/mysql/mysql-connector-java/maven-metadata.xml'
 );
 
-const MYSQL_MAVEN_MYSQL_POM = fs.readFileSync(
-  resolve(
-    __dirname,
-    './__fixtures__/repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12.pom'
-  ),
-  'utf8'
+const MYSQL_MAVEN_MYSQL_POM = loadFixture(
+  __filename,
+  'repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12.pom'
 );
 
 const config = {
diff --git a/lib/datasource/nuget/index.spec.ts b/lib/datasource/nuget/index.spec.ts
index c8ecb5a1da..777089b4ec 100644
--- a/lib/datasource/nuget/index.spec.ts
+++ b/lib/datasource/nuget/index.spec.ts
@@ -1,7 +1,6 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import { id as versioning } from '../../versioning/nuget';
 import { id as datasource, parseRegistryUrl } from '.';
@@ -10,81 +9,48 @@ const hostRules: any = _hostRules;
 
 jest.mock('../../util/host-rules');
 
-const pkgInfoV3FromNuget = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v3_nuget_org.xml',
-  'utf8'
-);
-const pkgListV3Registration = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v3_registration.json',
-  'utf8'
+const pkgInfoV3FromNuget = loadFixture(__filename, 'nunit/v3_nuget_org.xml');
+const pkgListV3Registration = loadFixture(
+  __filename,
+  'nunit/v3_registration.json'
 );
 
-const pkgListV2 = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v2.xml',
-  'utf8'
-);
-const pkgListV2NoGitHubProjectUrl = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v2_noGitHubProjectUrl.xml',
-  'utf8'
-);
-const pkgListV2NoRelease = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v2_no_release.xml',
-  'utf8'
+const pkgListV2 = loadFixture(__filename, 'nunit/v2.xml');
+const pkgListV2NoGitHubProjectUrl = loadFixture(
+  __filename,
+  'nunit/v2_noGitHubProjectUrl.xml'
 );
-const pkgListV2WithoutProjectUrl = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v2_withoutProjectUrl.xml',
-  'utf8'
+const pkgListV2NoRelease = loadFixture(__filename, 'nunit/v2_no_release.xml');
+const pkgListV2WithoutProjectUrl = loadFixture(
+  __filename,
+  'nunit/v2_withoutProjectUrl.xml'
 );
 
-const pkgListV2Page1of2 = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v2_paginated_1.xml',
-  'utf8'
-);
-const pkgListV2Page2of2 = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/nunit/v2_paginated_2.xml',
-  'utf8'
-);
+const pkgListV2Page1of2 = loadFixture(__filename, 'nunit/v2_paginated_1.xml');
+const pkgListV2Page2of2 = loadFixture(__filename, 'nunit/v2_paginated_2.xml');
 
-const nugetIndexV3 = fs.readFileSync(
-  'lib/datasource/nuget/__fixtures__/v3_index.json',
-  'utf8'
-);
+const nugetIndexV3 = loadFixture(__filename, 'v3_index.json');
 
 const nlogMocks = [
   {
     url: '/v3/registration5-gz-semver2/nlog/index.json',
-    result: fs.readFileSync(
-      'lib/datasource/nuget/__fixtures__/nlog/v3_registration.json',
-      'utf8'
-    ),
+    result: loadFixture(__filename, 'nlog/v3_registration.json'),
   },
   {
     url: '/v3/registration5-gz-semver2/nlog/page/1.0.0.505/4.4.0-beta5.json',
-    result: fs.readFileSync(
-      'lib/datasource/nuget/__fixtures__/nlog/v3_catalog_1.json',
-      'utf8'
-    ),
+    result: loadFixture(__filename, 'nlog/v3_catalog_1.json'),
   },
   {
     url: '/v3/registration5-gz-semver2/nlog/page/4.4.0-beta6/4.6.0-rc2.json',
-    result: fs.readFileSync(
-      'lib/datasource/nuget/__fixtures__/nlog/v3_catalog_2.json',
-      'utf8'
-    ),
+    result: loadFixture(__filename, 'nlog/v3_catalog_2.json'),
   },
   {
     url: '/v3/registration5-gz-semver2/nlog/page/4.6.0-rc3/5.0.0-beta11.json',
-    result: fs.readFileSync(
-      'lib/datasource/nuget/__fixtures__/nlog/v3_catalog_3.json',
-      'utf8'
-    ),
+    result: loadFixture(__filename, 'nlog/v3_catalog_3.json'),
   },
   {
     url: '/v3-flatcontainer/nlog/4.7.3/nlog.nuspec',
-    result: fs.readFileSync(
-      'lib/datasource/nuget/__fixtures__/nlog/nuspec.xml',
-      'utf8'
-    ),
+    result: loadFixture(__filename, 'nlog/nuspec.xml'),
   },
 ];
 
diff --git a/lib/datasource/packagist/index.spec.ts b/lib/datasource/packagist/index.spec.ts
index 3313208927..556339f47b 100644
--- a/lib/datasource/packagist/index.spec.ts
+++ b/lib/datasource/packagist/index.spec.ts
@@ -1,7 +1,6 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadJsonFixture } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import * as composerVersioning from '../../versioning/composer';
 import { id as versioning } from '../../versioning/loose';
@@ -11,15 +10,9 @@ jest.mock('../../util/host-rules');
 
 const hostRules = _hostRules;
 
-const includesJson: any = fs.readFileSync(
-  'lib/datasource/packagist/__fixtures__/includes.json'
-);
-const beytJson: any = fs.readFileSync(
-  'lib/datasource/packagist/__fixtures__/1beyt.json'
-);
-const mailchimpJson: any = fs.readFileSync(
-  'lib/datasource/packagist/__fixtures__/mailchimp-api.json'
-);
+const includesJson: any = loadJsonFixture(__filename, 'includes.json');
+const beytJson: any = loadJsonFixture(__filename, '1beyt.json');
+const mailchimpJson: any = loadJsonFixture(__filename, 'mailchimp-api.json');
 
 const baseUrl = 'https://packagist.org';
 
@@ -143,7 +136,7 @@ describe(getName(__filename), () => {
         .get('/packages.json')
         .reply(200, packagesJson)
         .get('/include/all$afbf74d51f31c7cbb5ff10304f9290bfb4f4e68b.json')
-        .reply(200, JSON.parse(includesJson));
+        .reply(200, includesJson);
       const res = await getPkgReleases({
         ...config,
         datasource,
@@ -227,7 +220,7 @@ describe(getName(__filename), () => {
         .get(
           '/p/wpackagist-plugin/1beyt$b574a802b5bf20a58c0f027e73aea2a75d23a6f654afc298a8dc467331be316a.json'
         )
-        .reply(200, JSON.parse(beytJson));
+        .reply(200, beytJson);
       const res = await getPkgReleases({
         ...config,
         datasource,
@@ -269,10 +262,7 @@ describe(getName(__filename), () => {
           '/p/providers-2018-09$14346045d7a7261cb3a12a6b7a1a7c4151982530347b115e5e277d879cad1942.json'
         )
         .reply(200, fileJson);
-      httpMock
-        .scope(baseUrl)
-        .get('/p/some/other.json')
-        .reply(200, JSON.parse(beytJson));
+      httpMock.scope(baseUrl).get('/p/some/other.json').reply(200, beytJson);
       const res = await getPkgReleases({
         ...config,
         datasource,
@@ -304,7 +294,7 @@ describe(getName(__filename), () => {
         .get(
           '/p/wpackagist-plugin/1beyt$b574a802b5bf20a58c0f027e73aea2a75d23a6f654afc298a8dc467331be316a.json'
         )
-        .reply(200, JSON.parse(beytJson));
+        .reply(200, beytJson);
       const res = await getPkgReleases({
         ...config,
         datasource,
@@ -334,10 +324,7 @@ describe(getName(__filename), () => {
         .scope('https://composer.renovatebot.com')
         .get('/packages.json')
         .reply(200, packagesJson);
-      httpMock
-        .scope(baseUrl)
-        .get('/p/some/other.json')
-        .reply(200, JSON.parse(beytJson));
+      httpMock.scope(baseUrl).get('/p/some/other.json').reply(200, beytJson);
       const res = await getPkgReleases({
         ...config,
         datasource,
@@ -351,7 +338,7 @@ describe(getName(__filename), () => {
       httpMock
         .scope(baseUrl)
         .get('/p/drewm/mailchimp-api.json')
-        .reply(200, JSON.parse(mailchimpJson));
+        .reply(200, mailchimpJson);
       config.registryUrls = ['https://packagist.org'];
       expect(
         await getPkgReleases({
@@ -367,7 +354,7 @@ describe(getName(__filename), () => {
       httpMock
         .scope(baseUrl)
         .get('/p/drewm/mailchimp-api.json')
-        .reply(200, JSON.parse(mailchimpJson));
+        .reply(200, mailchimpJson);
       config.registryUrls = [];
       expect(
         await getPkgReleases({
diff --git a/lib/datasource/pypi/index.spec.ts b/lib/datasource/pypi/index.spec.ts
index 75c8c8efcc..6a36bba660 100644
--- a/lib/datasource/pypi/index.spec.ts
+++ b/lib/datasource/pypi/index.spec.ts
@@ -1,27 +1,20 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import * as hostRules from '../../util/host-rules';
 import { id as datasource } from '.';
 
-const res1: any = fs.readFileSync(
-  'lib/datasource/pypi/__fixtures__/azure-cli-monitor.json'
+const res1: any = loadFixture(__filename, 'azure-cli-monitor.json');
+const res2: any = loadFixture(__filename, 'azure-cli-monitor-updated.json');
+const htmlResponse = loadFixture(__filename, 'versions-html.html');
+const badResponse = loadFixture(__filename, 'versions-html-badfile.html');
+const dataRequiresPythonResponse = loadFixture(
+  __filename,
+  'versions-html-data-requires-python.html'
 );
-const res2: any = fs.readFileSync(
-  'lib/datasource/pypi/__fixtures__/azure-cli-monitor-updated.json'
-);
-const htmlResponse = fs.readFileSync(
-  'lib/datasource/pypi/__fixtures__/versions-html.html'
-);
-const badResponse = fs.readFileSync(
-  'lib/datasource/pypi/__fixtures__/versions-html-badfile.html'
-);
-const dataRequiresPythonResponse = fs.readFileSync(
-  'lib/datasource/pypi/__fixtures__/versions-html-data-requires-python.html'
-);
-const mixedHyphensResponse = fs.readFileSync(
-  'lib/datasource/pypi/__fixtures__/versions-html-mixed-hyphens.html'
+const mixedHyphensResponse = loadFixture(
+  __filename,
+  'versions-html-mixed-hyphens.html'
 );
 
 const baseUrl = 'https://pypi.org/pypi';
diff --git a/lib/datasource/repology/index.spec.ts b/lib/datasource/repology/index.spec.ts
index 1079805e3a..9323908ac1 100644
--- a/lib/datasource/repology/index.spec.ts
+++ b/lib/datasource/repology/index.spec.ts
@@ -1,7 +1,6 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages';
 import { id as versioning } from '../../versioning/loose';
 import { RepologyPackage, id as datasource } from '.';
@@ -46,26 +45,11 @@ const mockResolverCall = (
   }
 };
 
-const fixtureNginx = fs.readFileSync(
-  `${__dirname}/__fixtures__/nginx.json`,
-  'utf8'
-);
-const fixtureGccDefaults = fs.readFileSync(
-  `${__dirname}/__fixtures__/gcc-defaults.json`,
-  'utf8'
-);
-const fixtureGcc = fs.readFileSync(
-  `${__dirname}/__fixtures__/gcc.json`,
-  'utf8'
-);
-const fixturePulseaudio = fs.readFileSync(
-  `${__dirname}/__fixtures__/pulseaudio.json`,
-  'utf8'
-);
-const fixtureJdk = fs.readFileSync(
-  `${__dirname}/__fixtures__/openjdk.json`,
-  'utf8'
-);
+const fixtureNginx = loadFixture(__filename, `nginx.json`);
+const fixtureGccDefaults = loadFixture(__filename, `gcc-defaults.json`);
+const fixtureGcc = loadFixture(__filename, `gcc.json`);
+const fixturePulseaudio = loadFixture(__filename, `pulseaudio.json`);
+const fixtureJdk = loadFixture(__filename, `openjdk.json`);
 
 describe(getName(__filename), () => {
   describe('getReleases', () => {
diff --git a/lib/datasource/ruby-version/index.spec.ts b/lib/datasource/ruby-version/index.spec.ts
index 759931897d..2f95bcfa91 100644
--- a/lib/datasource/ruby-version/index.spec.ts
+++ b/lib/datasource/ruby-version/index.spec.ts
@@ -1,13 +1,9 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { id as datasource } from '.';
 
-const rubyReleasesHtml = fs.readFileSync(
-  'lib/datasource/ruby-version/__fixtures__/releases.html',
-  'utf8'
-);
+const rubyReleasesHtml = loadFixture(__filename, 'releases.html');
 
 describe(getName(__filename), () => {
   describe('getReleases', () => {
diff --git a/lib/datasource/rubygems/__fixtures__/rubygems-org.txt b/lib/datasource/rubygems/__fixtures__/rubygems-org.txt
new file mode 100644
index 0000000000..69564ff592
--- /dev/null
+++ b/lib/datasource/rubygems/__fixtures__/rubygems-org.txt
@@ -0,0 +1,18 @@
+created_at: 2017-03-27T04:38:13+00:00
+---
+- 1 05d0116933ba44b0b5d0ee19bfd35ccc
+.cat 0.0.1 631fd60a806eaf5026c86fff3155c289
+0mq 0.1.0,0.1.1,0.1.2,0.2.0,0.2.1,0.3.0,0.4.0,0.4.1,0.5.0,0.5.1,0.5.2,0.5.3 6146193f8f7e944156b0b42ec37bad3e
+0xffffff 0.0.1,0.1.0 0a4a9aeae24152cdb467be02f40482f9
+10to1-crack 0.1.1,0.1.2,0.1.3 e7218e76477e2137355d2e7ded094925
+1234567890_ 1.0,1.1 233e818c2db65d2dad9f9ea9a27b1a30
+12_hour_time 0.0.2,0.0.3,0.0.4 4e58bc03e301f704950410b713c20b69
+16watts-fluently 0.3.0,0.3.1 555088e2b18e97e0293cab1d90dbb0d2
+189seg 0.0.1 c4d329f7d3eb88b6e602358968be0242
+196demo 0.0.0 e00c558565f7b03a438fbd93d854b7de
+1_as_identity_function 1.0.0,1.0.1 bee2f0fbbc3c5c83008c0b8fc64cb168
+1and1 1.1 1853e4495b036ddc5da2035523d48f0d
+1hdoc 0.1.3,0.2.0,0.2.2,0.2.3,0.2.4 7076f29c196df12047a3700c4d6e5915
+1pass 0.1.0,0.1.1,0.1.2 d209547aae4b8f3d67123f18f738ac99
+1pass -0.1.2 abcdef
+21-day-challenge-countdown 0.1.0,0.1.1,0.1.2 57e8873fe713063f4e54e85bbbd709bb
diff --git a/lib/datasource/rubygems/index.spec.ts b/lib/datasource/rubygems/index.spec.ts
index 29c849d9f2..92df66b559 100644
--- a/lib/datasource/rubygems/index.spec.ts
+++ b/lib/datasource/rubygems/index.spec.ts
@@ -1,30 +1,13 @@
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture, loadJsonFixture } from '../../../test/util';
 import * as rubyVersioning from '../../versioning/ruby';
-import railsInfo from './__fixtures__/rails/info.json';
-import railsVersions from './__fixtures__/rails/versions.json';
 import { resetCache } from './get-rubygems-org';
 import * as rubygems from '.';
 
-const rubygemsOrgVersions = `created_at: 2017-03-27T04:38:13+00:00
----
-- 1 05d0116933ba44b0b5d0ee19bfd35ccc
-.cat 0.0.1 631fd60a806eaf5026c86fff3155c289
-0mq 0.1.0,0.1.1,0.1.2,0.2.0,0.2.1,0.3.0,0.4.0,0.4.1,0.5.0,0.5.1,0.5.2,0.5.3 6146193f8f7e944156b0b42ec37bad3e
-0xffffff 0.0.1,0.1.0 0a4a9aeae24152cdb467be02f40482f9
-10to1-crack 0.1.1,0.1.2,0.1.3 e7218e76477e2137355d2e7ded094925
-1234567890_ 1.0,1.1 233e818c2db65d2dad9f9ea9a27b1a30
-12_hour_time 0.0.2,0.0.3,0.0.4 4e58bc03e301f704950410b713c20b69
-16watts-fluently 0.3.0,0.3.1 555088e2b18e97e0293cab1d90dbb0d2
-189seg 0.0.1 c4d329f7d3eb88b6e602358968be0242
-196demo 0.0.0 e00c558565f7b03a438fbd93d854b7de
-1_as_identity_function 1.0.0,1.0.1 bee2f0fbbc3c5c83008c0b8fc64cb168
-1and1 1.1 1853e4495b036ddc5da2035523d48f0d
-1hdoc 0.1.3,0.2.0,0.2.2,0.2.3,0.2.4 7076f29c196df12047a3700c4d6e5915
-1pass 0.1.0,0.1.1,0.1.2 d209547aae4b8f3d67123f18f738ac99
-1pass -0.1.2 abcdef
-21-day-challenge-countdown 0.1.0,0.1.1,0.1.2 57e8873fe713063f4e54e85bbbd709bb`;
+const rubygemsOrgVersions = loadFixture(__filename, 'rubygems-org.txt');
+const railsInfo = loadJsonFixture(__filename, 'rails/info.json');
+const railsVersions = loadJsonFixture(__filename, 'rails/versions.json');
 
 describe(getName(__filename), () => {
   describe('getReleases', () => {
diff --git a/lib/datasource/sbt-package/index.spec.ts b/lib/datasource/sbt-package/index.spec.ts
index ba30b93ad5..2616a41293 100644
--- a/lib/datasource/sbt-package/index.spec.ts
+++ b/lib/datasource/sbt-package/index.spec.ts
@@ -1,22 +1,13 @@
-import fs from 'fs';
 import nock from 'nock';
-import upath from 'upath';
 import { getPkgReleases } from '..';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import * as mavenVersioning from '../../versioning/maven';
 import { MAVEN_REPO } from '../maven/common';
 import { parseIndexDir } from '../sbt-plugin/util';
 import * as sbtPlugin from '.';
 
-const mavenIndexHtml = fs.readFileSync(
-  upath.resolve(__dirname, `./__fixtures__/maven-index.html`),
-  'utf8'
-);
-
-const sbtPluginIndex = fs.readFileSync(
-  upath.resolve(__dirname, `./__fixtures__/sbt-plugins-index.html`),
-  'utf8'
-);
+const mavenIndexHtml = loadFixture(__filename, `maven-index.html`);
+const sbtPluginIndex = loadFixture(__filename, `sbt-plugins-index.html`);
 
 describe(getName(__filename), () => {
   it('parses Maven index directory', () => {
diff --git a/lib/datasource/sbt-plugin/index.spec.ts b/lib/datasource/sbt-plugin/index.spec.ts
index ab8cd3e9f7..b8228ab500 100644
--- a/lib/datasource/sbt-plugin/index.spec.ts
+++ b/lib/datasource/sbt-plugin/index.spec.ts
@@ -1,22 +1,13 @@
-import fs from 'fs';
 import nock from 'nock';
-import upath from 'upath';
 import { getPkgReleases } from '..';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import * as mavenVersioning from '../../versioning/maven';
 import { MAVEN_REPO } from '../maven/common';
 import { parseIndexDir } from './util';
 import * as sbtPlugin from '.';
 
-const mavenIndexHtml = fs.readFileSync(
-  upath.resolve(__dirname, `./__fixtures__/maven-index.html`),
-  'utf8'
-);
-
-const sbtPluginIndex = fs.readFileSync(
-  upath.resolve(__dirname, `./__fixtures__/sbt-plugins-index.html`),
-  'utf8'
-);
+const mavenIndexHtml = loadFixture(__filename, `maven-index.html`);
+const sbtPluginIndex = loadFixture(__filename, `sbt-plugins-index.html`);
 
 describe(getName(__filename), () => {
   it('parses Maven index directory', () => {
diff --git a/lib/datasource/terraform-module/index.spec.ts b/lib/datasource/terraform-module/index.spec.ts
index d7d1d0b7ab..2d08c2dd29 100644
--- a/lib/datasource/terraform-module/index.spec.ts
+++ b/lib/datasource/terraform-module/index.spec.ts
@@ -1,17 +1,16 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { id as datasource } from '.';
 
-const consulData: any = fs.readFileSync(
-  'lib/datasource/terraform-module/__fixtures__/registry-consul.json'
+const consulData: any = loadFixture(__filename, 'registry-consul.json');
+const serviceDiscoveryResult: any = loadFixture(
+  __filename,
+  'service-discovery.json'
 );
-const serviceDiscoveryResult: any = fs.readFileSync(
-  'lib/datasource/terraform-module/__fixtures__/service-discovery.json'
-);
-const serviceDiscoveryCustomResult: any = fs.readFileSync(
-  'lib/datasource/terraform-module/__fixtures__/service-custom-discovery.json'
+const serviceDiscoveryCustomResult: any = loadFixture(
+  __filename,
+  'service-custom-discovery.json'
 );
 
 const baseUrl = 'https://registry.terraform.io';
diff --git a/lib/datasource/terraform-provider/index.spec.ts b/lib/datasource/terraform-provider/index.spec.ts
index c7725e2c74..44dfa44b29 100644
--- a/lib/datasource/terraform-provider/index.spec.ts
+++ b/lib/datasource/terraform-provider/index.spec.ts
@@ -1,17 +1,16 @@
-import fs from 'fs';
 import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { id as datasource, defaultRegistryUrls } from '.';
 
-const consulData: any = fs.readFileSync(
-  'lib/datasource/terraform-provider/__fixtures__/azurerm-provider.json'
+const consulData: any = loadFixture(__filename, 'azurerm-provider.json');
+const hashicorpReleases: any = loadFixture(
+  __filename,
+  'releaseBackendIndex.json'
 );
-const hashicorpReleases: any = fs.readFileSync(
-  'lib/datasource/terraform-provider/__fixtures__/releaseBackendIndex.json'
-);
-const serviceDiscoveryResult: any = fs.readFileSync(
-  'lib/datasource/terraform-module/__fixtures__/service-discovery.json'
+const serviceDiscoveryResult: any = loadFixture(
+  __filename,
+  'service-discovery.json'
 );
 
 const primaryUrl = defaultRegistryUrls[0];
diff --git a/lib/manager/ansible-galaxy/extract.spec.ts b/lib/manager/ansible-galaxy/extract.spec.ts
index b4f68b6f10..dd3593801e 100644
--- a/lib/manager/ansible-galaxy/extract.spec.ts
+++ b/lib/manager/ansible-galaxy/extract.spec.ts
@@ -1,31 +1,12 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import extractPackageFile, { getSliceEndNumber } from './extract';
 
-const yamlFile1 = readFileSync(
-  'lib/manager/ansible-galaxy/__fixtures__/requirements01.yml',
-  'utf8'
-);
-const yamlFile2 = readFileSync(
-  'lib/manager/ansible-galaxy/__fixtures__/requirements02.yml',
-  'utf8'
-);
-const helmRequirements = readFileSync(
-  'lib/manager/ansible-galaxy/__fixtures__/helmRequirements.yml',
-  'utf8'
-);
-const collections1 = readFileSync(
-  'lib/manager/ansible-galaxy/__fixtures__/collections1.yml',
-  'utf8'
-);
-const collections2 = readFileSync(
-  'lib/manager/ansible-galaxy/__fixtures__/collections2.yml',
-  'utf8'
-);
-const galaxy = readFileSync(
-  'lib/manager/ansible-galaxy/__fixtures__/galaxy.yml',
-  'utf8'
-);
+const yamlFile1 = loadFixture(__filename, 'requirements01.yml');
+const yamlFile2 = loadFixture(__filename, 'requirements02.yml');
+const helmRequirements = loadFixture(__filename, 'helmRequirements.yml');
+const collections1 = loadFixture(__filename, 'collections1.yml');
+const collections2 = loadFixture(__filename, 'collections2.yml');
+const galaxy = loadFixture(__filename, 'galaxy.yml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/ansible/extract.spec.ts b/lib/manager/ansible/extract.spec.ts
index 8b96d583d5..3e068cf406 100644
--- a/lib/manager/ansible/extract.spec.ts
+++ b/lib/manager/ansible/extract.spec.ts
@@ -1,15 +1,8 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import extractPackageFile from './extract';
 
-const yamlFile1 = readFileSync(
-  'lib/manager/ansible/__fixtures__/main1.yaml',
-  'utf8'
-);
-const yamlFile2 = readFileSync(
-  'lib/manager/ansible/__fixtures__/main2.yaml',
-  'utf8'
-);
+const yamlFile1 = loadFixture(__filename, 'main1.yaml');
+const yamlFile2 = loadFixture(__filename, 'main2.yaml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/azure-pipelines/extract.spec.ts b/lib/manager/azure-pipelines/extract.spec.ts
index 5ac96ae7ec..72dd4fcfad 100644
--- a/lib/manager/azure-pipelines/extract.spec.ts
+++ b/lib/manager/azure-pipelines/extract.spec.ts
@@ -1,5 +1,4 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import {
   extractContainer,
   extractPackageFile,
@@ -7,19 +6,16 @@ import {
   parseAzurePipelines,
 } from './extract';
 
-const azurePipelines = readFileSync(
-  'lib/manager/azure-pipelines/__fixtures__/azure-pipelines.yaml',
-  'utf8'
-);
+const azurePipelines = loadFixture(__filename, 'azure-pipelines.yaml');
 
-const azurePipelinesInvalid = readFileSync(
-  'lib/manager/azure-pipelines/__fixtures__/azure-pipelines-invalid.yaml',
-  'utf8'
+const azurePipelinesInvalid = loadFixture(
+  __filename,
+  'azure-pipelines-invalid.yaml'
 );
 
-const azurePipelinesNoDependency = readFileSync(
-  'lib/manager/azure-pipelines/__fixtures__/azure-pipelines-no-dependency.yaml',
-  'utf8'
+const azurePipelinesNoDependency = loadFixture(
+  __filename,
+  'azure-pipelines-no-dependency.yaml'
 );
 
 describe(getName(__filename), () => {
diff --git a/lib/manager/batect-wrapper/extract.spec.ts b/lib/manager/batect-wrapper/extract.spec.ts
index fe854eb369..06393f3cd2 100644
--- a/lib/manager/batect-wrapper/extract.spec.ts
+++ b/lib/manager/batect-wrapper/extract.spec.ts
@@ -1,19 +1,11 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { id as githubReleaseDatasource } from '../../datasource/github-releases';
 import { id as semverVersioning } from '../../versioning/semver';
 import type { PackageDependency } from '../types';
 import { extractPackageFile } from './extract';
 
-const validWrapperContent = readFileSync(
-  'lib/manager/batect-wrapper/__fixtures__/valid-wrapper',
-  'utf8'
-);
-
-const malformedWrapperContent = readFileSync(
-  'lib/manager/batect-wrapper/__fixtures__/malformed-wrapper',
-  'utf8'
-);
+const validWrapperContent = loadFixture(__filename, 'valid-wrapper');
+const malformedWrapperContent = loadFixture(__filename, 'malformed-wrapper');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/bazel/extract.spec.ts b/lib/manager/bazel/extract.spec.ts
index 23523f8359..be6a208c17 100644
--- a/lib/manager/bazel/extract.spec.ts
+++ b/lib/manager/bazel/extract.spec.ts
@@ -1,26 +1,10 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const workspaceFile = readFileSync(
-  'lib/manager/bazel/__fixtures__/WORKSPACE1',
-  'utf8'
-);
-
-const workspace2File = readFileSync(
-  'lib/manager/bazel/__fixtures__/WORKSPACE2',
-  'utf8'
-);
-
-const workspace3File = readFileSync(
-  'lib/manager/bazel/__fixtures__/WORKSPACE3',
-  'utf8'
-);
-
-const fileWithBzlExtension = readFileSync(
-  'lib/manager/bazel/__fixtures__/repositories.bzl',
-  'utf8'
-);
+const workspaceFile = loadFixture(__filename, 'WORKSPACE1');
+const workspace2File = loadFixture(__filename, 'WORKSPACE2');
+const workspace3File = loadFixture(__filename, 'WORKSPACE3');
+const fileWithBzlExtension = loadFixture(__filename, 'repositories.bzl');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/bazel/update.spec.ts b/lib/manager/bazel/update.spec.ts
index 41d5fadef2..db2b6bc82a 100644
--- a/lib/manager/bazel/update.spec.ts
+++ b/lib/manager/bazel/update.spec.ts
@@ -1,25 +1,12 @@
-import { readFileSync } from 'fs';
 import { Readable } from 'stream';
-import { resolve } from 'upath';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import type { UpdateType } from '../../config/types';
 import { updateDependency } from './update';
 
-const content = readFileSync(
-  resolve('lib/manager/bazel/__fixtures__/WORKSPACE1'),
-  'utf8'
-);
-
-const contentContainerPull = readFileSync(
-  resolve('lib/manager/bazel/__fixtures__/container_pull'),
-  'utf8'
-);
-
-const fileWithBzlExtension = readFileSync(
-  'lib/manager/bazel/__fixtures__/repositories.bzl',
-  'utf8'
-);
+const content = loadFixture(__filename, 'WORKSPACE1');
+const contentContainerPull = loadFixture(__filename, 'container_pull');
+const fileWithBzlExtension = loadFixture(__filename, 'repositories.bzl');
 
 /*
 git_repository(
diff --git a/lib/manager/buildkite/extract.spec.ts b/lib/manager/buildkite/extract.spec.ts
index 3d9704d173..911da7d3c9 100644
--- a/lib/manager/buildkite/extract.spec.ts
+++ b/lib/manager/buildkite/extract.spec.ts
@@ -1,23 +1,10 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const pipeline1 = readFileSync(
-  'lib/manager/buildkite/__fixtures__/pipeline1.yml',
-  'utf8'
-);
-const pipeline2 = readFileSync(
-  'lib/manager/buildkite/__fixtures__/pipeline2.yml',
-  'utf8'
-);
-const pipeline3 = readFileSync(
-  'lib/manager/buildkite/__fixtures__/pipeline3.yml',
-  'utf8'
-);
-const pipeline4 = readFileSync(
-  'lib/manager/buildkite/__fixtures__/pipeline4.yml',
-  'utf8'
-);
+const pipeline1 = loadFixture(__filename, 'pipeline1.yml');
+const pipeline2 = loadFixture(__filename, 'pipeline2.yml');
+const pipeline3 = loadFixture(__filename, 'pipeline3.yml');
+const pipeline4 = loadFixture(__filename, 'pipeline4.yml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/bundler/extract.spec.ts b/lib/manager/bundler/extract.spec.ts
index a70326a8cf..baefc8e48a 100644
--- a/lib/manager/bundler/extract.spec.ts
+++ b/lib/manager/bundler/extract.spec.ts
@@ -1,67 +1,33 @@
-import { readFileSync } from 'fs';
-import { fs, getName } from '../../../test/util';
+import { fs, getName, loadFixture } from '../../../test/util';
 import { isValid } from '../../versioning/ruby';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
 
-const railsGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.rails',
-  'utf8'
-);
-const railsGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.rails.lock',
-  'utf8'
-);
+const railsGemfile = loadFixture(__filename, 'Gemfile.rails');
+const railsGemfileLock = loadFixture(__filename, 'Gemfile.rails.lock');
 
-const sourceGroupGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.sourceGroup',
-  'utf8'
-);
-const webPackerGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.webpacker',
-  'utf8'
-);
-const webPackerGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.webpacker.lock',
-  'utf8'
-);
-const mastodonGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.mastodon',
-  'utf8'
-);
-const mastodonGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.mastodon.lock',
-  'utf8'
-);
-const rubyCIGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.rubyci.lock',
-  'utf8'
-);
+const sourceGroupGemfile = loadFixture(__filename, 'Gemfile.sourceGroup');
+const webPackerGemfile = loadFixture(__filename, 'Gemfile.webpacker');
+const webPackerGemfileLock = loadFixture(__filename, 'Gemfile.webpacker.lock');
+const mastodonGemfile = loadFixture(__filename, 'Gemfile.mastodon');
+const mastodonGemfileLock = loadFixture(__filename, 'Gemfile.mastodon.lock');
+const rubyCIGemfileLock = loadFixture(__filename, 'Gemfile.rubyci.lock');
 
-const rubyCIGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.rubyci',
-  'utf8'
-);
-const gitlabFossGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.gitlab-foss.lock',
-  'utf8'
-);
-const gitlabFossGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.gitlab-foss',
-  'utf8'
-);
-const sourceBlockGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.sourceBlock',
-  'utf8'
+const rubyCIGemfile = loadFixture(__filename, 'Gemfile.rubyci');
+const gitlabFossGemfileLock = loadFixture(
+  __filename,
+  'Gemfile.gitlab-foss.lock'
 );
-const sourceBlockWithNewLinesGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.sourceBlockWithNewLines.lock',
-  'utf8'
+const gitlabFossGemfile = loadFixture(__filename, 'Gemfile.gitlab-foss');
+const sourceBlockGemfile = loadFixture(__filename, 'Gemfile.sourceBlock');
+const sourceBlockWithNewLinesGemfileLock = loadFixture(
+  __filename,
+  'Gemfile.sourceBlockWithNewLines.lock'
 );
-const sourceBlockWithNewLinesGemfile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.sourceBlockWithNewLines',
-  'utf8'
+const sourceBlockWithNewLinesGemfile = loadFixture(
+  __filename,
+  'Gemfile.sourceBlockWithNewLines'
 );
 
 function validateGems(raw, parsed) {
diff --git a/lib/manager/bundler/gemfile.spec.ts b/lib/manager/bundler/gemfile.spec.ts
index cee947b8a8..a066c10e2f 100644
--- a/lib/manager/bundler/gemfile.spec.ts
+++ b/lib/manager/bundler/gemfile.spec.ts
@@ -1,10 +1,8 @@
-import { readFileSync } from 'fs';
+import { loadFixture } from '../../../test/util';
 import { extractLockFileEntries } from './locked-version';
 
-const gemLockFile = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.rails.lock',
-  'utf8'
-);
+const gemLockFile = loadFixture(__filename, 'Gemfile.rails.lock');
+
 describe('extract lib/manager/bundler/gemfile.rails.lock', () => {
   it('matches the expected output', () => {
     expect(extractLockFileEntries(gemLockFile)).toMatchSnapshot();
diff --git a/lib/manager/bundler/locked-version.spec.ts b/lib/manager/bundler/locked-version.spec.ts
index 6670a10aa4..6401691b7b 100644
--- a/lib/manager/bundler/locked-version.spec.ts
+++ b/lib/manager/bundler/locked-version.spec.ts
@@ -1,26 +1,15 @@
-import { readFileSync } from 'fs';
+import { loadFixture } from '../../../test/util';
 import { extractLockFileEntries } from './locked-version';
 
-const railsGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.rails.lock',
-  'utf8'
-);
-const webPackerGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.webpacker.lock',
-  'utf8'
-);
-const mastodonGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.mastodon.lock',
-  'utf8'
-);
-const rubyCIGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.rubyci.lock',
-  'utf8'
-);
-const gitlabFossGemfileLock = readFileSync(
-  'lib/manager/bundler/__fixtures__/Gemfile.gitlab-foss.lock',
-  'utf8'
+const railsGemfileLock = loadFixture(__filename, 'Gemfile.rails.lock');
+const webPackerGemfileLock = loadFixture(__filename, 'Gemfile.webpacker.lock');
+const mastodonGemfileLock = loadFixture(__filename, 'Gemfile.mastodon.lock');
+const rubyCIGemfileLock = loadFixture(__filename, 'Gemfile.rubyci.lock');
+const gitlabFossGemfileLock = loadFixture(
+  __filename,
+  'Gemfile.gitlab-foss.lock'
 );
+
 describe('/lib/manager/bundler/locked-version', () => {
   test('Parse Rails Gem Lock File', () => {
     const parsedLockEntries = extractLockFileEntries(railsGemfileLock);
diff --git a/lib/manager/cake/index.spec.ts b/lib/manager/cake/index.spec.ts
index c354776c5e..eae5704131 100644
--- a/lib/manager/cake/index.spec.ts
+++ b/lib/manager/cake/index.spec.ts
@@ -1,11 +1,7 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
-const content = readFileSync(
-  'lib/manager/cake/__fixtures__/build.cake',
-  'utf8'
-);
+const content = loadFixture(__filename, 'build.cake');
 
 describe(getName(__filename), () => {
   it('extracts', () => {
diff --git a/lib/manager/cargo/extract.spec.ts b/lib/manager/cargo/extract.spec.ts
index cfaf0d624c..761785d803 100644
--- a/lib/manager/cargo/extract.spec.ts
+++ b/lib/manager/cargo/extract.spec.ts
@@ -1,39 +1,16 @@
-import { readFileSync } from 'fs';
 import { dir } from 'tmp-promise';
 import { join } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { setFsConfig, writeLocalFile } from '../../util/fs';
 import { extractPackageFile } from './extract';
 
-const cargo1toml = readFileSync(
-  'lib/manager/cargo/__fixtures__/Cargo.1.toml',
-  'utf8'
-);
-const cargo2toml = readFileSync(
-  'lib/manager/cargo/__fixtures__/Cargo.2.toml',
-  'utf8'
-);
-const cargo3toml = readFileSync(
-  'lib/manager/cargo/__fixtures__/Cargo.3.toml',
-  'utf8'
-);
-const cargo4toml = readFileSync(
-  'lib/manager/cargo/__fixtures__/Cargo.4.toml',
-  'utf8'
-);
-const cargo5toml = readFileSync(
-  'lib/manager/cargo/__fixtures__/Cargo.5.toml',
-  'utf8'
-);
-
-const cargo6configtoml = readFileSync(
-  'lib/manager/cargo/__fixtures__/cargo.6.config.toml',
-  'utf8'
-);
-const cargo6toml = readFileSync(
-  'lib/manager/cargo/__fixtures__/Cargo.6.toml',
-  'utf8'
-);
+const cargo1toml = loadFixture(__filename, 'Cargo.1.toml');
+const cargo2toml = loadFixture(__filename, 'Cargo.2.toml');
+const cargo3toml = loadFixture(__filename, 'Cargo.3.toml');
+const cargo4toml = loadFixture(__filename, 'Cargo.4.toml');
+const cargo5toml = loadFixture(__filename, 'Cargo.5.toml');
+const cargo6configtoml = loadFixture(__filename, 'cargo.6.config.toml');
+const cargo6toml = loadFixture(__filename, 'Cargo.6.toml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/cdnurl/extract.spec.ts b/lib/manager/cdnurl/extract.spec.ts
index 0a01f316df..7d03a1539f 100644
--- a/lib/manager/cdnurl/extract.spec.ts
+++ b/lib/manager/cdnurl/extract.spec.ts
@@ -1,12 +1,7 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
-const input = readFileSync(
-  resolve(__dirname, `./__fixtures__/sample.txt`),
-  'utf8'
-);
+const input = loadFixture(__filename, `sample.txt`);
 
 describe(getName(__filename), () => {
   it('extractPackageFile', () => {
diff --git a/lib/manager/circleci/extract.spec.ts b/lib/manager/circleci/extract.spec.ts
index fc25189c58..dc31c4a5a5 100644
--- a/lib/manager/circleci/extract.spec.ts
+++ b/lib/manager/circleci/extract.spec.ts
@@ -1,19 +1,9 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const file1 = readFileSync(
-  'lib/manager/circleci/__fixtures__/config.yml',
-  'utf8'
-);
-const file2 = readFileSync(
-  'lib/manager/circleci/__fixtures__/config2.yml',
-  'utf8'
-);
-const file3 = readFileSync(
-  'lib/manager/circleci/__fixtures__/config3.yml',
-  'utf8'
-);
+const file1 = loadFixture(__filename, 'config.yml');
+const file2 = loadFixture(__filename, 'config2.yml');
+const file3 = loadFixture(__filename, 'config3.yml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/cloudbuild/extract.spec.ts b/lib/manager/cloudbuild/extract.spec.ts
index 116a38c644..4301cf5cce 100644
--- a/lib/manager/cloudbuild/extract.spec.ts
+++ b/lib/manager/cloudbuild/extract.spec.ts
@@ -1,11 +1,7 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const file1 = readFileSync(
-  'lib/manager/cloudbuild/__fixtures__/cloudbuild.yml',
-  'utf8'
-);
+const file1 = loadFixture(__filename, 'cloudbuild.yml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/cocoapods/extract.spec.ts b/lib/manager/cocoapods/extract.spec.ts
index 09d456474f..d8e5d18dcb 100644
--- a/lib/manager/cocoapods/extract.spec.ts
+++ b/lib/manager/cocoapods/extract.spec.ts
@@ -1,18 +1,8 @@
-import fs from 'fs-extra';
-import upath from 'upath';
-
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
-const simplePodfile = fs.readFileSync(
-  upath.resolve(__dirname, './__fixtures__/Podfile.simple'),
-  'utf-8'
-);
-
-const complexPodfile = fs.readFileSync(
-  upath.resolve(__dirname, './__fixtures__/Podfile.complex'),
-  'utf-8'
-);
+const simplePodfile = loadFixture(__filename, 'Podfile.simple');
+const complexPodfile = loadFixture(__filename, 'Podfile.complex');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/composer/extract.spec.ts b/lib/manager/composer/extract.spec.ts
index 04bf9d7121..f7dc652ef6 100644
--- a/lib/manager/composer/extract.spec.ts
+++ b/lib/manager/composer/extract.spec.ts
@@ -1,33 +1,14 @@
-import { readFileSync } from 'fs';
-import { fs, getName } from '../../../test/util';
+import { fs, getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
 
-const requirements1 = readFileSync(
-  'lib/manager/composer/__fixtures__/composer1.json',
-  'utf8'
-);
-const requirements2 = readFileSync(
-  'lib/manager/composer/__fixtures__/composer2.json',
-  'utf8'
-);
-const requirements3 = readFileSync(
-  'lib/manager/composer/__fixtures__/composer3.json',
-  'utf8'
-);
-const requirements4 = readFileSync(
-  'lib/manager/composer/__fixtures__/composer4.json',
-  'utf8'
-);
-const requirements5 = readFileSync(
-  'lib/manager/composer/__fixtures__/composer5.json',
-  'utf8'
-);
-const requirements5Lock = readFileSync(
-  'lib/manager/composer/__fixtures__/composer5.lock',
-  'utf8'
-);
+const requirements1 = loadFixture(__filename, 'composer1.json');
+const requirements2 = loadFixture(__filename, 'composer2.json');
+const requirements3 = loadFixture(__filename, 'composer3.json');
+const requirements4 = loadFixture(__filename, 'composer4.json');
+const requirements5 = loadFixture(__filename, 'composer5.json');
+const requirements5Lock = loadFixture(__filename, 'composer5.lock');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/deps-edn/extract.spec.ts b/lib/manager/deps-edn/extract.spec.ts
index dd550044a7..b240919bb7 100644
--- a/lib/manager/deps-edn/extract.spec.ts
+++ b/lib/manager/deps-edn/extract.spec.ts
@@ -1,13 +1,7 @@
-/* eslint-disable no-template-curly-in-string */
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const depsEdn = readFileSync(
-  resolve(__dirname, `./__fixtures__/deps.edn`),
-  'utf8'
-);
+const depsEdn = loadFixture(__filename, 'deps.edn');
 
 describe(getName(__filename), () => {
   it('extractPackageFile', () => {
diff --git a/lib/manager/docker-compose/extract.spec.ts b/lib/manager/docker-compose/extract.spec.ts
index 915e00345f..4cca8cd425 100644
--- a/lib/manager/docker-compose/extract.spec.ts
+++ b/lib/manager/docker-compose/extract.spec.ts
@@ -1,20 +1,11 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const yamlFile1 = readFileSync(
-  'lib/manager/docker-compose/__fixtures__/docker-compose.1.yml',
-  'utf8'
-);
-
-const yamlFile3 = readFileSync(
-  'lib/manager/docker-compose/__fixtures__/docker-compose.3.yml',
-  'utf8'
-);
-
-const yamlFile3NoVersion = readFileSync(
-  'lib/manager/docker-compose/__fixtures__/docker-compose.3-no-version.yml',
-  'utf8'
+const yamlFile1 = loadFixture(__filename, 'docker-compose.1.yml');
+const yamlFile3 = loadFixture(__filename, 'docker-compose.3.yml');
+const yamlFile3NoVersion = loadFixture(
+  __filename,
+  'docker-compose.3-no-version.yml'
 );
 
 describe(getName(__filename), () => {
diff --git a/lib/manager/dockerfile/extract.spec.ts b/lib/manager/dockerfile/extract.spec.ts
index fcdf3409bc..6a72adff49 100644
--- a/lib/manager/dockerfile/extract.spec.ts
+++ b/lib/manager/dockerfile/extract.spec.ts
@@ -1,16 +1,8 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile, getDep } from './extract';
 
-const d1 = readFileSync(
-  'lib/manager/dockerfile/__fixtures__/1.Dockerfile',
-  'utf8'
-);
-
-const d2 = readFileSync(
-  'lib/manager/dockerfile/__fixtures__/2.Dockerfile',
-  'utf8'
-);
+const d1 = loadFixture(__filename, '1.Dockerfile');
+const d2 = loadFixture(__filename, '2.Dockerfile');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/droneci/extract.spec.ts b/lib/manager/droneci/extract.spec.ts
index 585137d56d..3855871bb7 100644
--- a/lib/manager/droneci/extract.spec.ts
+++ b/lib/manager/droneci/extract.spec.ts
@@ -1,13 +1,8 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 
 import { extractPackageFile } from './extract';
 
-const droneYAML = readFileSync(
-  resolve('lib/manager/droneci/__fixtures__/.drone.yml'),
-  'utf8'
-);
+const droneYAML = loadFixture(__filename, '.drone.yml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/github-actions/extract.spec.ts b/lib/manager/github-actions/extract.spec.ts
index 9e607beda7..96b5790699 100644
--- a/lib/manager/github-actions/extract.spec.ts
+++ b/lib/manager/github-actions/extract.spec.ts
@@ -1,16 +1,8 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const workflow1 = readFileSync(
-  'lib/manager/github-actions/__fixtures__/workflow.yml.1',
-  'utf8'
-);
-
-const workflow2 = readFileSync(
-  'lib/manager/github-actions/__fixtures__/workflow.yml.2',
-  'utf8'
-);
+const workflow1 = loadFixture(__filename, 'workflow.yml.1');
+const workflow2 = loadFixture(__filename, 'workflow.yml.2');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/gitlabci-include/extract.spec.ts b/lib/manager/gitlabci-include/extract.spec.ts
index f7083030c5..d0e561f84c 100644
--- a/lib/manager/gitlabci-include/extract.spec.ts
+++ b/lib/manager/gitlabci-include/extract.spec.ts
@@ -1,11 +1,7 @@
-import fs from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const yamlFile = fs.readFileSync(
-  'lib/manager/gitlabci-include/__fixtures__/gitlab-ci.1.yaml',
-  'utf8'
-);
+const yamlFile = loadFixture(__filename, 'gitlab-ci.1.yaml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/gomod/extract.spec.ts b/lib/manager/gomod/extract.spec.ts
index d0ae06a506..e24ba7a50e 100644
--- a/lib/manager/gomod/extract.spec.ts
+++ b/lib/manager/gomod/extract.spec.ts
@@ -1,10 +1,9 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const gomod1 = readFileSync('lib/manager/gomod/__fixtures__/1/go.mod', 'utf8');
-const gomod2 = readFileSync('lib/manager/gomod/__fixtures__/2/go.mod', 'utf8');
-const gomod3 = readFileSync('lib/manager/gomod/__fixtures__/3/go.mod', 'utf8');
+const gomod1 = loadFixture(__filename, '1/go.mod');
+const gomod2 = loadFixture(__filename, '2/go.mod');
+const gomod3 = loadFixture(__filename, '3/go.mod');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/gomod/update.spec.ts b/lib/manager/gomod/update.spec.ts
index 6dfba946bf..eb03ca3cfc 100644
--- a/lib/manager/gomod/update.spec.ts
+++ b/lib/manager/gomod/update.spec.ts
@@ -1,10 +1,9 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import type { UpdateType } from '../../config/types';
 import { updateDependency } from './update';
 
-const gomod1 = readFileSync('lib/manager/gomod/__fixtures__/1/go.mod', 'utf8');
-const gomod2 = readFileSync('lib/manager/gomod/__fixtures__/2/go.mod', 'utf8');
+const gomod1 = loadFixture(__filename, '1/go.mod');
+const gomod2 = loadFixture(__filename, '2/go.mod');
 
 describe(getName(__filename), () => {
   describe('updateDependency', () => {
diff --git a/lib/manager/gradle-lite/parser.spec.ts b/lib/manager/gradle-lite/parser.spec.ts
index 560d365dbd..972653ff4b 100644
--- a/lib/manager/gradle-lite/parser.spec.ts
+++ b/lib/manager/gradle-lite/parser.spec.ts
@@ -1,13 +1,7 @@
-import { readFileSync } from 'fs';
-import path from 'path';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { GOOGLE_REPO, JCENTER_REPO, MAVEN_REPO } from './common';
 import { parseGradle, parseProps } from './parser';
 
-function getGradleFile(fileName: string): string {
-  return readFileSync(path.resolve(__dirname, fileName), 'utf8');
-}
-
 describe(getName(__filename), () => {
   it('handles end of input', () => {
     expect(parseGradle('version = ').deps).toBeEmpty();
@@ -162,8 +156,10 @@ describe(getName(__filename), () => {
     ]);
   });
   it('parses fixture from "gradle" manager', () => {
-    const content = getGradleFile(
-      `../gradle/__fixtures__/build.gradle.example1`
+    const content = loadFixture(
+      __filename,
+      'build.gradle.example1',
+      '../gradle'
     );
     const { deps } = parseGradle(content, {}, 'build.gradle');
     deps.forEach((dep) => {
diff --git a/lib/manager/gradle-wrapper/extract.spec.ts b/lib/manager/gradle-wrapper/extract.spec.ts
index b3d3a149d1..f436ccdafd 100644
--- a/lib/manager/gradle-wrapper/extract.spec.ts
+++ b/lib/manager/gradle-wrapper/extract.spec.ts
@@ -1,27 +1,13 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const propertiesFile1 = readFileSync(
-  resolve(__dirname, './__fixtures__/gradle-wrapper-1.properties'),
-  'utf8'
-);
-const propertiesFile2 = readFileSync(
-  resolve(__dirname, './__fixtures__/gradle-wrapper-2.properties'),
-  'utf8'
-);
-const propertiesFile3 = readFileSync(
-  resolve(__dirname, './__fixtures__/gradle-wrapper-3.properties'),
-  'utf8'
-);
-const propertiesFile4 = readFileSync(
-  resolve(__dirname, './__fixtures__/gradle-wrapper-4.properties'),
-  'utf8'
-);
-const whitespacePropertiesFile = readFileSync(
-  resolve(__dirname, './__fixtures__/gradle-wrapper-whitespace.properties'),
-  'utf8'
+const propertiesFile1 = loadFixture(__filename, 'gradle-wrapper-1.properties');
+const propertiesFile2 = loadFixture(__filename, 'gradle-wrapper-2.properties');
+const propertiesFile3 = loadFixture(__filename, 'gradle-wrapper-3.properties');
+const propertiesFile4 = loadFixture(__filename, 'gradle-wrapper-4.properties');
+const whitespacePropertiesFile = loadFixture(
+  __filename,
+  'gradle-wrapper-whitespace.properties'
 );
 
 describe(getName(__filename), () => {
diff --git a/lib/manager/helm-values/extract.spec.ts b/lib/manager/helm-values/extract.spec.ts
index 3db74c265e..53fbc34783 100644
--- a/lib/manager/helm-values/extract.spec.ts
+++ b/lib/manager/helm-values/extract.spec.ts
@@ -1,15 +1,14 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const helmDefaultChartInitValues = readFileSync(
-  'lib/manager/helm-values/__fixtures__/default_chart_init_values.yaml',
-  'utf8'
+const helmDefaultChartInitValues = loadFixture(
+  __filename,
+  'default_chart_init_values.yaml'
 );
 
-const helmMultiAndNestedImageValues = readFileSync(
-  'lib/manager/helm-values/__fixtures__/multi_and_nested_image_values.yaml',
-  'utf8'
+const helmMultiAndNestedImageValues = loadFixture(
+  __filename,
+  'multi_and_nested_image_values.yaml'
 );
 
 describe(getName(__filename), () => {
diff --git a/lib/manager/helmfile/extract.spec.ts b/lib/manager/helmfile/extract.spec.ts
index 7c983e6c7a..3a3888575a 100644
--- a/lib/manager/helmfile/extract.spec.ts
+++ b/lib/manager/helmfile/extract.spec.ts
@@ -1,11 +1,8 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const multidocYaml = readFileSync(
-  'lib/manager/helmfile/__fixtures__/multidoc.yaml',
-  'utf8'
-);
+const multidocYaml = loadFixture(__filename, 'multidoc.yaml');
+
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
     beforeEach(() => {
diff --git a/lib/manager/homebrew/extract.spec.ts b/lib/manager/homebrew/extract.spec.ts
index d4c61f7d27..b4e8f6d8d8 100644
--- a/lib/manager/homebrew/extract.spec.ts
+++ b/lib/manager/homebrew/extract.spec.ts
@@ -1,24 +1,11 @@
-import fs from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const aalib = fs.readFileSync(
-  'lib/manager/homebrew/__fixtures__/aalib.rb',
-  'utf8'
-);
-const aap = fs.readFileSync('lib/manager/homebrew/__fixtures__/aap.rb', 'utf8');
-const acmetool = fs.readFileSync(
-  'lib/manager/homebrew/__fixtures__/acmetool.rb',
-  'utf8'
-);
-const aide = fs.readFileSync(
-  'lib/manager/homebrew/__fixtures__/aide.rb',
-  'utf8'
-);
-const ibazel = fs.readFileSync(
-  'lib/manager/homebrew/__fixtures__/ibazel.rb',
-  'utf8'
-);
+const aalib = loadFixture(__filename, 'aalib.rb');
+const aap = loadFixture(__filename, 'aap.rb');
+const acmetool = loadFixture(__filename, 'acmetool.rb');
+const aide = loadFixture(__filename, 'aide.rb');
+const ibazel = loadFixture(__filename, 'ibazel.rb');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/homebrew/update.spec.ts b/lib/manager/homebrew/update.spec.ts
index 84aafa850a..ad7f6df4a7 100644
--- a/lib/manager/homebrew/update.spec.ts
+++ b/lib/manager/homebrew/update.spec.ts
@@ -1,17 +1,10 @@
-import fs from 'fs';
 import { Readable } from 'stream';
 import * as httpMock from '../../../test/http-mock';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { updateDependency } from './update';
 
-const aide = fs.readFileSync(
-  'lib/manager/homebrew/__fixtures__/aide.rb',
-  'utf8'
-);
-const ibazel = fs.readFileSync(
-  'lib/manager/homebrew/__fixtures__/ibazel.rb',
-  'utf8'
-);
+const aide = loadFixture(__filename, 'aide.rb');
+const ibazel = loadFixture(__filename, 'ibazel.rb');
 
 const baseUrl = 'https://github.com';
 
diff --git a/lib/manager/html/extract.spec.ts b/lib/manager/html/extract.spec.ts
index 7f27a8eb30..20bfa9720b 100644
--- a/lib/manager/html/extract.spec.ts
+++ b/lib/manager/html/extract.spec.ts
@@ -1,16 +1,8 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
-const sample = readFileSync(
-  resolve(__dirname, `./__fixtures__/sample.html`),
-  'utf8'
-);
-const nothing = readFileSync(
-  resolve(__dirname, `./__fixtures__/nothing.html`),
-  'utf8'
-);
+const sample = loadFixture(__filename, `sample.html`);
+const nothing = loadFixture(__filename, `nothing.html`);
 
 describe(getName(__filename), () => {
   it('extractPackageFile', () => {
diff --git a/lib/manager/jenkins/extract.spec.ts b/lib/manager/jenkins/extract.spec.ts
index 36775a6e26..b9481d1576 100644
--- a/lib/manager/jenkins/extract.spec.ts
+++ b/lib/manager/jenkins/extract.spec.ts
@@ -1,29 +1,13 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const invalidYamlFile = readFileSync(
-  'lib/manager/jenkins/__fixtures__/invalid.yaml',
-  'utf8'
-);
-
-const pluginsTextFile = readFileSync(
-  'lib/manager/jenkins/__fixtures__/plugins.txt',
-  'utf8'
-);
-const pluginsYamlFile = readFileSync(
-  'lib/manager/jenkins/__fixtures__/plugins.yaml',
-  'utf8'
-);
-
-const pluginsEmptyTextFile = readFileSync(
-  'lib/manager/jenkins/__fixtures__/empty.txt',
-  'utf8'
-);
-const pluginsEmptyYamlFile = readFileSync(
-  'lib/manager/jenkins/__fixtures__/empty.yaml',
-  'utf8'
-);
+const invalidYamlFile = loadFixture(__filename, 'invalid.yaml');
+
+const pluginsTextFile = loadFixture(__filename, 'plugins.txt');
+const pluginsYamlFile = loadFixture(__filename, 'plugins.yaml');
+
+const pluginsEmptyTextFile = loadFixture(__filename, 'empty.txt');
+const pluginsEmptyYamlFile = loadFixture(__filename, 'empty.yaml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/kubernetes/extract.spec.ts b/lib/manager/kubernetes/extract.spec.ts
index 8862eaf8c0..04fe288e18 100644
--- a/lib/manager/kubernetes/extract.spec.ts
+++ b/lib/manager/kubernetes/extract.spec.ts
@@ -1,26 +1,10 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const kubernetesImagesFile = readFileSync(
-  'lib/manager/kubernetes/__fixtures__/kubernetes.yaml',
-  'utf8'
-);
-
-const kubernetesConfigMapFile = readFileSync(
-  'lib/manager/kubernetes/__fixtures__/configmap.yaml',
-  'utf8'
-);
-
-const kubernetesArraySyntaxFile = readFileSync(
-  'lib/manager/kubernetes/__fixtures__/array-syntax.yaml',
-  'utf8'
-);
-
-const otherYamlFile = readFileSync(
-  'lib/manager/kubernetes/__fixtures__/gitlab-ci.yaml',
-  'utf8'
-);
+const kubernetesImagesFile = loadFixture(__filename, 'kubernetes.yaml');
+const kubernetesConfigMapFile = loadFixture(__filename, 'configmap.yaml');
+const kubernetesArraySyntaxFile = loadFixture(__filename, 'array-syntax.yaml');
+const otherYamlFile = loadFixture(__filename, 'gitlab-ci.yaml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/kustomize/extract.spec.ts b/lib/manager/kustomize/extract.spec.ts
index f7330ce303..e4da4782ae 100644
--- a/lib/manager/kustomize/extract.spec.ts
+++ b/lib/manager/kustomize/extract.spec.ts
@@ -1,5 +1,4 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import * as datasourceDocker from '../../datasource/docker';
 import * as datasourceGitTags from '../../datasource/git-tags';
 import * as datasourceGitHubTags from '../../datasource/github-tags';
@@ -11,47 +10,18 @@ import {
   parseKustomize,
 } from './extract';
 
-const kustomizeGitSSHBase = readFileSync(
-  'lib/manager/kustomize/__fixtures__/gitSshBase.yaml',
-  'utf8'
+const kustomizeGitSSHBase = loadFixture(__filename, 'gitSshBase.yaml');
+const kustomizeEmpty = loadFixture(__filename, 'kustomizeEmpty.yaml');
+const kustomizeGitSSHSubdir = loadFixture(__filename, 'gitSubdir.yaml');
+const kustomizeHTTP = loadFixture(__filename, 'kustomizeHttp.yaml');
+const kustomizeWithLocal = loadFixture(__filename, 'kustomizeWithLocal.yaml');
+const nonKustomize = loadFixture(__filename, 'service.yaml');
+const gitImages = loadFixture(__filename, 'gitImages.yaml');
+const kustomizeDepsInResources = loadFixture(
+  __filename,
+  'depsInResources.yaml'
 );
-
-const kustomizeEmpty = readFileSync(
-  'lib/manager/kustomize/__fixtures__/kustomizeEmpty.yaml',
-  'utf8'
-);
-
-const kustomizeGitSSHSubdir = readFileSync(
-  'lib/manager/kustomize/__fixtures__/gitSubdir.yaml',
-  'utf8'
-);
-
-const kustomizeHTTP = readFileSync(
-  'lib/manager/kustomize/__fixtures__/kustomizeHttp.yaml',
-  'utf8'
-);
-
-const kustomizeWithLocal = readFileSync(
-  'lib/manager/kustomize/__fixtures__/kustomizeWithLocal.yaml',
-  'utf8'
-);
-
-const nonKustomize = readFileSync(
-  'lib/manager/kustomize/__fixtures__/service.yaml',
-  'utf8'
-);
-
-const gitImages = readFileSync(
-  'lib/manager/kustomize/__fixtures__/gitImages.yaml',
-  'utf8'
-);
-
-const kustomizeDepsInResources = readFileSync(
-  'lib/manager/kustomize/__fixtures__/depsInResources.yaml',
-  'utf8'
-);
-
-const sha = readFileSync('lib/manager/kustomize/__fixtures__/sha.yaml', 'utf8');
+const sha = loadFixture(__filename, 'sha.yaml');
 
 describe(getName(__filename), () => {
   it('should successfully parse a valid kustomize file', () => {
diff --git a/lib/manager/leiningen/extract.spec.ts b/lib/manager/leiningen/extract.spec.ts
index 22a2616410..681db83205 100644
--- a/lib/manager/leiningen/extract.spec.ts
+++ b/lib/manager/leiningen/extract.spec.ts
@@ -1,14 +1,8 @@
-/* eslint-disable no-template-curly-in-string */
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import * as datasourceClojure from '../../datasource/clojure';
 import { extractFromVectors, extractPackageFile, trimAtKey } from './extract';
 
-const leinProjectClj = readFileSync(
-  resolve(__dirname, `./__fixtures__/project.clj`),
-  'utf8'
-);
+const leinProjectClj = loadFixture(__filename, `project.clj`);
 
 describe(getName(__filename), () => {
   it('trimAtKey', () => {
diff --git a/lib/manager/maven/extract.spec.ts b/lib/manager/maven/extract.spec.ts
index 8ba6f95218..36c443fe3f 100644
--- a/lib/manager/maven/extract.spec.ts
+++ b/lib/manager/maven/extract.spec.ts
@@ -1,18 +1,9 @@
 /* eslint-disable no-template-curly-in-string */
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackage } from './extract';
 
-const minimumContent = readFileSync(
-  resolve(__dirname, `./__fixtures__/minimum.pom.xml`),
-  'utf8'
-);
-
-const simpleContent = readFileSync(
-  resolve(__dirname, `./__fixtures__/simple.pom.xml`),
-  'utf8'
-);
+const minimumContent = loadFixture(__filename, `minimum.pom.xml`);
+const simpleContent = loadFixture(__filename, `simple.pom.xml`);
 
 describe(getName(__filename), () => {
   describe('extractDependencies', () => {
diff --git a/lib/manager/maven/index.spec.ts b/lib/manager/maven/index.spec.ts
index 548b71f426..4be69a337c 100644
--- a/lib/manager/maven/index.spec.ts
+++ b/lib/manager/maven/index.spec.ts
@@ -1,27 +1,14 @@
-import { readFileSync } from 'fs';
-import { fs, getName } from '../../../test/util';
+import { fs, getName, loadFixture } from '../../../test/util';
 import type { PackageDependency, PackageFile } from '../types';
 import { extractPackage, resolveParents } from './extract';
 import { extractAllPackageFiles, updateDependency } from '.';
 
 jest.mock('../../util/fs');
 
-const pomContent = readFileSync(
-  'lib/manager/maven/__fixtures__/simple.pom.xml',
-  'utf8'
-);
-const pomParent = readFileSync(
-  'lib/manager/maven/__fixtures__/parent.pom.xml',
-  'utf8'
-);
-const pomChild = readFileSync(
-  'lib/manager/maven/__fixtures__/child.pom.xml',
-  'utf8'
-);
-const origContent = readFileSync(
-  'lib/manager/maven/__fixtures__/grouping.pom.xml',
-  'utf8'
-);
+const pomContent = loadFixture(__filename, 'simple.pom.xml');
+const pomParent = loadFixture(__filename, 'parent.pom.xml');
+const pomChild = loadFixture(__filename, 'child.pom.xml');
+const origContent = loadFixture(__filename, 'grouping.pom.xml');
 
 function selectDep(deps: PackageDependency[], name = 'org.example:quuz') {
   return deps.find((dep) => dep.depName === name);
diff --git a/lib/manager/meteor/extract.spec.ts b/lib/manager/meteor/extract.spec.ts
index 6bfb2f1867..7171f03582 100644
--- a/lib/manager/meteor/extract.spec.ts
+++ b/lib/manager/meteor/extract.spec.ts
@@ -1,13 +1,7 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-function readFixture(fixture: string) {
-  return readFileSync(resolve(__dirname, `./__fixtures__/${fixture}`), 'utf8');
-}
-
-const input01Content = readFixture('package-1.js');
+const input01Content = loadFixture(__filename, 'package-1.js');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/mix/extract.spec.ts b/lib/manager/mix/extract.spec.ts
index b350d5750f..834c210a50 100644
--- a/lib/manager/mix/extract.spec.ts
+++ b/lib/manager/mix/extract.spec.ts
@@ -1,12 +1,7 @@
-import fs from 'fs-extra';
-import upath from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
-const sample = fs.readFileSync(
-  upath.resolve(__dirname, './__fixtures__/mix.exs'),
-  'utf-8'
-);
+const sample = loadFixture(__filename, 'mix.exs');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/npm/extract/index.spec.ts b/lib/manager/npm/extract/index.spec.ts
index beda16f2a1..b4ea83e1ef 100644
--- a/lib/manager/npm/extract/index.spec.ts
+++ b/lib/manager/npm/extract/index.spec.ts
@@ -1,6 +1,4 @@
-import { readFileSync } from 'fs';
-import upath from 'upath';
-import { getName } from '../../../../test/util';
+import { getName, loadFixture } from '../../../../test/util';
 import { getConfig } from '../../../config/defaults';
 import * as _fs from '../../../util/fs';
 import * as npmExtract from '.';
@@ -10,18 +8,19 @@ const fs: any = _fs;
 // TODO: fix types
 const defaultConfig = getConfig();
 
-function readFixture(fixture: string) {
-  return readFileSync(
-    upath.resolve(__dirname, `../__fixtures__/${fixture}`),
-    'utf8'
-  );
-}
-
-const input01Content = readFixture('inputs/01.json');
-const workspacesContent = readFixture('inputs/workspaces.json');
-const workspacesSimpleContent = readFixture('inputs/workspaces-simple.json');
-const vendorisedContent = readFixture('is-object.json');
-const invalidNameContent = readFixture('invalid-name.json');
+const input01Content = loadFixture(__filename, 'inputs/01.json', '..');
+const workspacesContent = loadFixture(
+  __filename,
+  'inputs/workspaces.json',
+  '..'
+);
+const workspacesSimpleContent = loadFixture(
+  __filename,
+  'inputs/workspaces-simple.json',
+  '..'
+);
+const vendorisedContent = loadFixture(__filename, 'is-object.json', '..');
+const invalidNameContent = loadFixture(__filename, 'invalid-name.json', '..');
 
 describe(getName(__filename), () => {
   describe('.extractPackageFile()', () => {
diff --git a/lib/manager/npm/extract/npm.spec.ts b/lib/manager/npm/extract/npm.spec.ts
index 4a9962c402..1946d3e61e 100644
--- a/lib/manager/npm/extract/npm.spec.ts
+++ b/lib/manager/npm/extract/npm.spec.ts
@@ -1,5 +1,4 @@
-import { readFileSync } from 'fs';
-import { fs, getName } from '../../../../test/util';
+import { fs, getName, loadFixture } from '../../../../test/util';
 import { getNpmLock } from './npm';
 
 jest.mock('../../../util/fs');
@@ -12,8 +11,10 @@ describe(getName(__filename), () => {
       expect(Object.keys(res.lockedVersions)).toHaveLength(0);
     });
     it('extracts', async () => {
-      const plocktest1Lock = readFileSync(
-        'lib/manager/npm/__fixtures__/plocktest1/package-lock.json'
+      const plocktest1Lock = loadFixture(
+        __filename,
+        'plocktest1/package-lock.json',
+        '..'
       );
       fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock as never);
       const res = await getNpmLock('package.json');
@@ -21,9 +22,7 @@ describe(getName(__filename), () => {
       expect(Object.keys(res.lockedVersions)).toHaveLength(7);
     });
     it('extracts npm 7 lockfile', async () => {
-      const npm7Lock = readFileSync(
-        'lib/manager/npm/__fixtures__/npm7/package-lock.json'
-      );
+      const npm7Lock = loadFixture(__filename, 'npm7/package-lock.json', '..');
       fs.readLocalFile.mockResolvedValueOnce(npm7Lock as never);
       const res = await getNpmLock('package.json');
       expect(res).toMatchSnapshot();
diff --git a/lib/manager/npm/extract/yarn.spec.ts b/lib/manager/npm/extract/yarn.spec.ts
index 9b91d26772..9882b37147 100644
--- a/lib/manager/npm/extract/yarn.spec.ts
+++ b/lib/manager/npm/extract/yarn.spec.ts
@@ -1,5 +1,4 @@
-import { readFileSync } from 'fs';
-import { fs, getName } from '../../../../test/util';
+import { fs, getName, loadFixture } from '../../../../test/util';
 import { getYarnLock } from './yarn';
 
 jest.mock('../../../util/fs');
@@ -14,9 +13,10 @@ describe(getName(__filename), () => {
     });
 
     it('extracts yarn 1', async () => {
-      const plocktest1Lock = readFileSync(
-        'lib/manager/npm/__fixtures__/plocktest1/yarn.lock',
-        'utf8'
+      const plocktest1Lock = loadFixture(
+        __filename,
+        'plocktest1/yarn.lock',
+        '..'
       );
       fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
       const res = await getYarnLock('package.json');
@@ -27,10 +27,7 @@ describe(getName(__filename), () => {
     });
 
     it('extracts yarn 2', async () => {
-      const plocktest1Lock = readFileSync(
-        'lib/manager/npm/__fixtures__/yarn2/yarn.lock',
-        'utf8'
-      );
+      const plocktest1Lock = loadFixture(__filename, 'yarn2/yarn.lock', '..');
       fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
       const res = await getYarnLock('package.json');
       expect(res.isYarn1).toBe(false);
@@ -40,10 +37,7 @@ describe(getName(__filename), () => {
     });
 
     it('extracts yarn 2 cache version', async () => {
-      const plocktest1Lock = readFileSync(
-        'lib/manager/npm/__fixtures__/yarn2.2/yarn.lock',
-        'utf8'
-      );
+      const plocktest1Lock = loadFixture(__filename, 'yarn2.2/yarn.lock', '..');
       fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
       const res = await getYarnLock('package.json');
       expect(res.isYarn1).toBe(false);
diff --git a/lib/manager/npm/update/dependency/index.spec.ts b/lib/manager/npm/update/dependency/index.spec.ts
index a663e644d3..b2a2c177b3 100644
--- a/lib/manager/npm/update/dependency/index.spec.ts
+++ b/lib/manager/npm/update/dependency/index.spec.ts
@@ -1,15 +1,7 @@
-import fs from 'fs';
-import upath from 'upath';
-
-import { getName } from '../../../../../test/util';
+import { getName, loadFixture } from '../../../../../test/util';
 import * as npmUpdater from '.';
 
-function readFixture(fixture: string) {
-  return fs.readFileSync(
-    upath.resolve(__dirname, `../../__fixtures__/${fixture}`),
-    'utf8'
-  );
-}
+const readFixture = (x: string): string => loadFixture(__filename, x, '../..');
 
 const input01Content = readFixture('inputs/01.json');
 const input01GlobContent = readFixture('inputs/01-glob.json');
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 47e0122b74..577b931722 100644
--- a/lib/manager/npm/update/locked-dependency/dep-constraints.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/dep-constraints.spec.ts
@@ -1,16 +1,10 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../../../test/util';
+import { getName, loadJsonFixture } from '../../../../../test/util';
 import { findDepConstraints } from './dep-constraints';
 
 jest.mock('../../../../util/fs');
 
-const packageJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/package.json'), 'utf8')
-);
-const packageLockJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/package-lock.json'), 'utf8')
-);
+const packageJson = loadJsonFixture(__filename, 'package.json');
+const packageLockJson = loadJsonFixture(__filename, 'package-lock.json');
 
 describe(getName(__filename), () => {
   describe('findDepConstraints()', () => {
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 f6ee9de18a..80370af9e5 100644
--- a/lib/manager/npm/update/locked-dependency/get-locked.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/get-locked.spec.ts
@@ -1,13 +1,9 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../../../test/util';
+import { getName, loadJsonFixture } from '../../../../../test/util';
 import { getLockedDependencies } from './get-locked';
 
 jest.mock('../../../../util/fs');
 
-const packageLockJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/package-lock.json'), 'utf8')
-);
+const packageLockJson = loadJsonFixture(__filename, 'package-lock.json');
 
 describe(getName(__filename), () => {
   describe('getLockedDependencies()', () => {
diff --git a/lib/manager/npm/update/locked-dependency/index.spec.ts b/lib/manager/npm/update/locked-dependency/index.spec.ts
index b5cff2f0e1..ebcda22278 100644
--- a/lib/manager/npm/update/locked-dependency/index.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/index.spec.ts
@@ -1,43 +1,19 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
 import * as httpMock from '../../../../../test/http-mock';
-import { getName } from '../../../../../test/util';
+import { getName, loadFixture } from '../../../../../test/util';
 import { clone } from '../../../../util/clone';
 import type { UpdateLockedConfig } from '../../../types';
 import { updateLockedDependency } from '.';
 
-const packageFileContent = readFileSync(
-  resolve(__dirname, './__fixtures__/package.json'),
-  'utf8'
-);
-const lockFileContent = readFileSync(
-  resolve(__dirname, './__fixtures__/package-lock.json'),
-  'utf8'
-);
-
-const acceptsJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/accepts.json'), 'utf8')
-);
-
-const expressJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/express.json'), 'utf8')
-);
-
-const mimeJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/mime.json'), 'utf8')
-);
-
+const packageFileContent = loadFixture(__filename, 'package.json');
+const lockFileContent = loadFixture(__filename, 'package-lock.json');
+const acceptsJson = JSON.parse(loadFixture(__filename, 'accepts.json'));
+const expressJson = JSON.parse(loadFixture(__filename, 'express.json'));
+const mimeJson = JSON.parse(loadFixture(__filename, 'mime.json'));
 const serveStaticJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/serve-static.json'), 'utf8')
-);
-
-const sendJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/send.json'), 'utf8')
-);
-
-const typeIsJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/type-is.json'), 'utf8')
+  loadFixture(__filename, 'serve-static.json')
 );
+const sendJson = JSON.parse(loadFixture(__filename, 'send.json'));
+const typeIsJson = JSON.parse(loadFixture(__filename, 'type-is.json'));
 
 describe(getName(__filename), () => {
   describe('updateLockedDependency()', () => {
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 ee2e5a7c3d..0e5717c181 100644
--- a/lib/manager/npm/update/locked-dependency/parent-version.spec.ts
+++ b/lib/manager/npm/update/locked-dependency/parent-version.spec.ts
@@ -1,12 +1,8 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
 import * as httpMock from '../../../../../test/http-mock';
-import { getName } from '../../../../../test/util';
+import { getName, loadJsonFixture } from '../../../../../test/util';
 import { findFirstParentVersion } from './parent-version';
 
-const expressJson = JSON.parse(
-  readFileSync(resolve(__dirname, './__fixtures__/express.json'), 'utf8')
-);
+const expressJson = loadJsonFixture(__filename, 'express.json');
 
 describe(getName(__filename), () => {
   describe('getLockedDependencies()', () => {
diff --git a/lib/manager/pip_requirements/extract.spec.ts b/lib/manager/pip_requirements/extract.spec.ts
index 9607c03eeb..886f6059fe 100644
--- a/lib/manager/pip_requirements/extract.spec.ts
+++ b/lib/manager/pip_requirements/extract.spec.ts
@@ -1,40 +1,14 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { setAdminConfig } from '../../config/admin';
 import { extractPackageFile } from './extract';
 
-const requirements1 = readFileSync(
-  'lib/manager/pip_requirements/__fixtures__/requirements1.txt',
-  'utf8'
-);
-const requirements2 = readFileSync(
-  'lib/manager/pip_requirements/__fixtures__/requirements2.txt',
-  'utf8'
-);
-const requirements3 = readFileSync(
-  'lib/manager/pip_requirements/__fixtures__/requirements3.txt',
-  'utf8'
-);
-
-const requirements4 = readFileSync(
-  'lib/manager/pip_requirements/__fixtures__/requirements4.txt',
-  'utf8'
-);
-
-const requirements5 = readFileSync(
-  'lib/manager/pip_requirements/__fixtures__/requirements5.txt',
-  'utf8'
-);
-
-const requirements6 = readFileSync(
-  'lib/manager/pip_requirements/__fixtures__/requirements6.txt',
-  'utf8'
-);
-
-const requirements7 = readFileSync(
-  'lib/manager/pip_requirements/__fixtures__/requirements7.txt',
-  'utf8'
-);
+const requirements1 = loadFixture(__filename, 'requirements1.txt');
+const requirements2 = loadFixture(__filename, 'requirements2.txt');
+const requirements3 = loadFixture(__filename, 'requirements3.txt');
+const requirements4 = loadFixture(__filename, 'requirements4.txt');
+const requirements5 = loadFixture(__filename, 'requirements5.txt');
+const requirements6 = loadFixture(__filename, 'requirements6.txt');
+const requirements7 = loadFixture(__filename, 'requirements7.txt');
 
 describe(getName(__filename), () => {
   beforeEach(() => {
diff --git a/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap b/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap
index 69fad81daa..540026674e 100644
--- a/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap
+++ b/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap
@@ -390,9 +390,9 @@ Array [
     },
   },
   Object {
-    "cmd": "<extract.py> \\"lib/manager/pip_setup/__fixtures__/setup.py\\"",
+    "cmd": "<extract.py> \\"setup.py\\"",
     "options": Object {
-      "cwd": "/tmp/github/some/repo/lib/manager/pip_setup/__fixtures__",
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -449,9 +449,9 @@ Array [
     },
   },
   Object {
-    "cmd": "<extract.py> \\"lib/manager/pip_setup/__fixtures__/setup.py\\"",
+    "cmd": "<extract.py> \\"setup.py\\"",
     "options": Object {
-      "cwd": "/tmp/github/some/repo/lib/manager/pip_setup/__fixtures__",
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
diff --git a/lib/manager/pip_setup/index.spec.ts b/lib/manager/pip_setup/index.spec.ts
index b5cd418f0c..b81802bc82 100644
--- a/lib/manager/pip_setup/index.spec.ts
+++ b/lib/manager/pip_setup/index.spec.ts
@@ -1,4 +1,3 @@
-import { readFileSync } from 'fs';
 import {
   ExecSnapshots,
   envMock,
@@ -6,18 +5,16 @@ import {
   mockExecAll,
   mockExecSequence,
 } from '../../../test/exec-util';
-import { env, getName } from '../../../test/util';
+import { env, getName, loadFixture } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as fs from '../../util/fs';
 import * as extract from './extract';
 import { extractPackageFile } from '.';
 
-const packageFile = 'lib/manager/pip_setup/__fixtures__/setup.py';
-const content = readFileSync(packageFile, 'utf8');
-
-const packageFileJson = 'lib/manager/pip_setup/__fixtures__/setup.py.json';
-const jsonContent = readFileSync(packageFileJson, 'utf8');
+const packageFile = 'setup.py';
+const content = loadFixture(__filename, packageFile);
+const jsonContent = loadFixture(__filename, 'setup.py.json');
 
 const config = {
   localDir: '/tmp/github/some/repo',
diff --git a/lib/manager/pipenv/extract.spec.ts b/lib/manager/pipenv/extract.spec.ts
index 5e491d6bd3..d302208b92 100644
--- a/lib/manager/pipenv/extract.spec.ts
+++ b/lib/manager/pipenv/extract.spec.ts
@@ -1,29 +1,13 @@
-import fs from 'fs';
-import { fs as fsutil, getName } from '../../../test/util';
+import { fs as fsutil, getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
 
-const pipfile1 = fs.readFileSync(
-  'lib/manager/pipenv/__fixtures__/Pipfile1',
-  'utf8'
-);
-const pipfile2 = fs.readFileSync(
-  'lib/manager/pipenv/__fixtures__/Pipfile2',
-  'utf8'
-);
-const pipfile3 = fs.readFileSync(
-  'lib/manager/pipenv/__fixtures__/Pipfile3',
-  'utf8'
-);
-const pipfile4 = fs.readFileSync(
-  'lib/manager/pipenv/__fixtures__/Pipfile4',
-  'utf8'
-);
-const pipfile5 = fs.readFileSync(
-  'lib/manager/pipenv/__fixtures__/Pipfile5',
-  'utf8'
-);
+const pipfile1 = loadFixture(__filename, 'Pipfile1');
+const pipfile2 = loadFixture(__filename, 'Pipfile2');
+const pipfile3 = loadFixture(__filename, 'Pipfile3');
+const pipfile4 = loadFixture(__filename, 'Pipfile4');
+const pipfile5 = loadFixture(__filename, 'Pipfile5');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts
index c8a8aa9cb8..92466cf6aa 100644
--- a/lib/manager/poetry/artifacts.spec.ts
+++ b/lib/manager/poetry/artifacts.spec.ts
@@ -1,9 +1,8 @@
 import { exec as _exec } from 'child_process';
-import { readFileSync } from 'fs';
 import _fs from 'fs-extra';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/exec-util';
-import { mocked } from '../../../test/util';
+import { loadFixture, mocked } from '../../../test/util';
 import * as _datasource from '../../datasource';
 import { setExecConfig } from '../../util/exec';
 import { BinarySource } from '../../util/exec/common';
@@ -12,10 +11,7 @@ import * as _env from '../../util/exec/env';
 import * as _hostRules from '../../util/host-rules';
 import { updateArtifacts } from './artifacts';
 
-const pyproject10toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.10.toml',
-  'utf8'
-);
+const pyproject10toml = loadFixture(__filename, 'pyproject.10.toml');
 
 jest.mock('fs-extra');
 jest.mock('child_process');
diff --git a/lib/manager/poetry/extract.spec.ts b/lib/manager/poetry/extract.spec.ts
index 8e69b74862..5991b47a68 100644
--- a/lib/manager/poetry/extract.spec.ts
+++ b/lib/manager/poetry/extract.spec.ts
@@ -1,65 +1,21 @@
-import { readFileSync } from 'fs';
-import { fs, getName } from '../../../test/util';
+import { fs, getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/fs');
 
-const pyproject1toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.1.toml',
-  'utf8'
-);
-
-const pyproject2toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.2.toml',
-  'utf8'
-);
-
-const pyproject3toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.3.toml',
-  'utf8'
-);
-
-const pyproject4toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.4.toml',
-  'utf8'
-);
-
-const pyproject5toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.5.toml',
-  'utf8'
-);
-
-const pyproject6toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.6.toml',
-  'utf8'
-);
-
-const pyproject7toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.7.toml',
-  'utf8'
-);
-
-const pyproject8toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.8.toml',
-  'utf8'
-);
-
-const pyproject9toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.9.toml',
-  'utf8'
-);
+const pyproject1toml = loadFixture(__filename, 'pyproject.1.toml');
+const pyproject2toml = loadFixture(__filename, 'pyproject.2.toml');
+const pyproject3toml = loadFixture(__filename, 'pyproject.3.toml');
+const pyproject4toml = loadFixture(__filename, 'pyproject.4.toml');
+const pyproject5toml = loadFixture(__filename, 'pyproject.5.toml');
+const pyproject6toml = loadFixture(__filename, 'pyproject.6.toml');
+const pyproject7toml = loadFixture(__filename, 'pyproject.7.toml');
+const pyproject8toml = loadFixture(__filename, 'pyproject.8.toml');
+const pyproject9toml = loadFixture(__filename, 'pyproject.9.toml');
 
 // pyproject.10.toml use by artifacts
-
-const pyproject11toml = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.11.toml',
-  'utf8'
-);
-
-const pyproject11tomlLock = readFileSync(
-  'lib/manager/poetry/__fixtures__/pyproject.11.toml.lock',
-  'utf8'
-);
+const pyproject11toml = loadFixture(__filename, 'pyproject.11.toml');
+const pyproject11tomlLock = loadFixture(__filename, 'pyproject.11.toml.lock');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/pre-commit/extract.spec.ts b/lib/manager/pre-commit/extract.spec.ts
index 18f4df48b1..fd9ae0b6c5 100644
--- a/lib/manager/pre-commit/extract.spec.ts
+++ b/lib/manager/pre-commit/extract.spec.ts
@@ -1,41 +1,34 @@
-import { readFileSync } from 'fs';
-import { getName, mocked } from '../../../test/util';
+import { getName, loadFixture, mocked } from '../../../test/util';
 import * as _hostRules from '../../util/host-rules';
 import { extractPackageFile } from './extract';
 
 jest.mock('../../util/host-rules');
 const hostRules = mocked(_hostRules);
-
 const filename = '.pre-commit.yaml';
 
-const complexPrecommitConfig = readFileSync(
-  'lib/manager/pre-commit/__fixtures__/complex.pre-commit-config.yaml',
-  'utf8'
+const complexPrecommitConfig = loadFixture(
+  __filename,
+  'complex.pre-commit-config.yaml'
 );
-
-const examplePrecommitConfig = readFileSync(
-  'lib/manager/pre-commit/__fixtures__/.pre-commit-config.yaml',
-  'utf8'
+const examplePrecommitConfig = loadFixture(
+  __filename,
+  '.pre-commit-config.yaml'
 );
-
-const emptyReposPrecommitConfig = readFileSync(
-  'lib/manager/pre-commit/__fixtures__/empty_repos.pre-commit-config.yaml',
-  'utf8'
+const emptyReposPrecommitConfig = loadFixture(
+  __filename,
+  'empty_repos.pre-commit-config.yaml'
 );
-
-const noReposPrecommitConfig = readFileSync(
-  'lib/manager/pre-commit/__fixtures__/no_repos.pre-commit-config.yaml',
-  'utf8'
+const noReposPrecommitConfig = loadFixture(
+  __filename,
+  'no_repos.pre-commit-config.yaml'
 );
-
-const invalidRepoPrecommitConfig = readFileSync(
-  'lib/manager/pre-commit/__fixtures__/invalid_repo.pre-commit-config.yaml',
-  'utf8'
+const invalidRepoPrecommitConfig = loadFixture(
+  __filename,
+  'invalid_repo.pre-commit-config.yaml'
 );
-
-const enterpriseGitPrecommitConfig = readFileSync(
-  'lib/manager/pre-commit/__fixtures__/enterprise.pre-commit-config.yaml',
-  'utf8'
+const enterpriseGitPrecommitConfig = loadFixture(
+  __filename,
+  'enterprise.pre-commit-config.yaml'
 );
 
 describe(getName(__filename), () => {
diff --git a/lib/manager/pub/extract.spec.ts b/lib/manager/pub/extract.spec.ts
index 6130772162..1b5c74a5d6 100644
--- a/lib/manager/pub/extract.spec.ts
+++ b/lib/manager/pub/extract.spec.ts
@@ -1,16 +1,8 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from '.';
 
-const brokenYaml = readFileSync(
-  'lib/manager/pub/__fixtures__/update.yaml',
-  'utf8'
-);
-
-const packageFile = readFileSync(
-  'lib/manager/pub/__fixtures__/extract.yaml',
-  'utf8'
-);
+const brokenYaml = loadFixture(__filename, 'update.yaml');
+const packageFile = loadFixture(__filename, 'extract.yaml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile', () => {
diff --git a/lib/manager/regex/index.spec.ts b/lib/manager/regex/index.spec.ts
index 7d69417eeb..0f944b63a9 100644
--- a/lib/manager/regex/index.spec.ts
+++ b/lib/manager/regex/index.spec.ts
@@ -1,22 +1,11 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { logger } from '../../logger';
 import type { CustomExtractConfig } from '../types';
 import { defaultConfig, extractPackageFile } from '.';
 
-const dockerfileContent = readFileSync(
-  resolve(__dirname, `./__fixtures__/Dockerfile`),
-  'utf8'
-);
-const ansibleYamlContent = readFileSync(
-  resolve(__dirname, `./__fixtures__/ansible.yml`),
-  'utf8'
-);
-const exampleJsonContent = readFileSync(
-  resolve(__dirname, `./__fixtures__/example.json`),
-  'utf8'
-);
+const dockerfileContent = loadFixture(__filename, `Dockerfile`);
+const ansibleYamlContent = loadFixture(__filename, `ansible.yml`);
+const exampleJsonContent = loadFixture(__filename, `example.json`);
 
 describe(getName(__filename), () => {
   it('has default config', () => {
diff --git a/lib/manager/sbt/extract.spec.ts b/lib/manager/sbt/extract.spec.ts
index f4f0453ed4..9ddb983133 100644
--- a/lib/manager/sbt/extract.spec.ts
+++ b/lib/manager/sbt/extract.spec.ts
@@ -1,29 +1,19 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const sbt = readFileSync(
-  resolve(__dirname, `./__fixtures__/sample.sbt`),
-  'utf8'
+const sbt = loadFixture(__filename, `sample.sbt`);
+const sbtScalaVersionVariable = loadFixture(
+  __filename,
+  `scala-version-variable.sbt`
 );
-const sbtScalaVersionVariable = readFileSync(
-  resolve(__dirname, `./__fixtures__/scala-version-variable.sbt`),
-  'utf8'
+const sbtMissingScalaVersion = loadFixture(
+  __filename,
+  `missing-scala-version.sbt`
 );
-const sbtMissingScalaVersion = readFileSync(
-  resolve(__dirname, `./__fixtures__/missing-scala-version.sbt`),
-  'utf8'
-);
-
-const sbtDependencyFile = readFileSync(
-  resolve(__dirname, `./__fixtures__/dependency-file.scala`),
-  'utf8'
-);
-
-const sbtPrivateVariableDependencyFile = readFileSync(
-  resolve(__dirname, `./__fixtures__/private-variable-dependency-file.scala`),
-  'utf8'
+const sbtDependencyFile = loadFixture(__filename, `dependency-file.scala`);
+const sbtPrivateVariableDependencyFile = loadFixture(
+  __filename,
+  `private-variable-dependency-file.scala`
 );
 
 describe(getName(__filename), () => {
diff --git a/lib/manager/setup-cfg/extract.spec.ts b/lib/manager/setup-cfg/extract.spec.ts
index 97d564c32e..693c3d6d0b 100644
--- a/lib/manager/setup-cfg/extract.spec.ts
+++ b/lib/manager/setup-cfg/extract.spec.ts
@@ -1,11 +1,7 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const content = readFileSync(
-  'lib/manager/setup-cfg/__fixtures__/setup-cfg-1.txt',
-  'utf8'
-);
+const content = loadFixture(__filename, 'setup-cfg-1.txt');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/swift/index.spec.ts b/lib/manager/swift/index.spec.ts
index fcc6362a2c..3c0e909185 100644
--- a/lib/manager/swift/index.spec.ts
+++ b/lib/manager/swift/index.spec.ts
@@ -1,12 +1,7 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const pkgContent = readFileSync(
-  resolve(__dirname, `./__fixtures__/SamplePackage.swift`),
-  'utf8'
-);
+const pkgContent = loadFixture(__filename, `SamplePackage.swift`);
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/terraform/extract.spec.ts b/lib/manager/terraform/extract.spec.ts
index 11f80a1817..b617c39b85 100644
--- a/lib/manager/terraform/extract.spec.ts
+++ b/lib/manager/terraform/extract.spec.ts
@@ -1,13 +1,12 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const tf1 = readFileSync('lib/manager/terraform/__fixtures__/1.tf', 'utf8');
+const tf1 = loadFixture(__filename, '1.tf');
 const tf2 = `module "relative" {
   source = "../../modules/fe"
 }
 `;
-const helm = readFileSync('lib/manager/terraform/__fixtures__/helm.tf', 'utf8');
+const helm = loadFixture(__filename, 'helm.tf');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/terragrunt/extract.spec.ts b/lib/manager/terragrunt/extract.spec.ts
index 23e68f7d4e..90626f785b 100644
--- a/lib/manager/terragrunt/extract.spec.ts
+++ b/lib/manager/terragrunt/extract.spec.ts
@@ -1,8 +1,7 @@
-import { readFileSync } from 'fs';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const tg1 = readFileSync('lib/manager/terragrunt/__fixtures__/2.hcl', 'utf8');
+const tg1 = loadFixture(__filename, '2.hcl');
 const tg2 = `terragrunt {
   source = "../../modules/fe"
 }
diff --git a/lib/manager/travis/extract.spec.ts b/lib/manager/travis/extract.spec.ts
index 08ade54140..8335256c0c 100644
--- a/lib/manager/travis/extract.spec.ts
+++ b/lib/manager/travis/extract.spec.ts
@@ -1,12 +1,7 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-const invalidYAML = readFileSync(
-  resolve('lib/manager/travis/__fixtures__/invalid.yml'),
-  'utf8'
-);
+const invalidYAML = loadFixture(__filename, 'invalid.yml');
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/travis/update.spec.ts b/lib/manager/travis/update.spec.ts
index 518dbf6132..b36897e7f4 100644
--- a/lib/manager/travis/update.spec.ts
+++ b/lib/manager/travis/update.spec.ts
@@ -1,12 +1,7 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { updateDependency } from './update';
 
-const content = readFileSync(
-  resolve('lib/manager/travis/__fixtures__/travis.yml'),
-  'utf8'
-);
+const content = loadFixture(__filename, 'travis.yml');
 
 describe(getName(__filename), () => {
   describe('updateDependency', () => {
diff --git a/lib/platform/github/index.spec.ts b/lib/platform/github/index.spec.ts
index ebcd4a20d0..f6002def84 100644
--- a/lib/platform/github/index.spec.ts
+++ b/lib/platform/github/index.spec.ts
@@ -1,7 +1,6 @@
-import fs from 'fs-extra';
 import { DateTime } from 'luxon';
 import * as httpMock from '../../../test/http-mock';
-import { getName, mocked } from '../../../test/util';
+import { getName, loadFixture, mocked } from '../../../test/util';
 import {
   REPOSITORY_NOT_FOUND,
   REPOSITORY_RENAMED,
@@ -42,13 +41,13 @@ describe(getName(__filename), () => {
     httpMock.reset();
   });
 
-  const graphqlOpenPullRequests = fs.readFileSync(
-    'lib/platform/github/__fixtures__/graphql/pullrequest-1.json',
-    'utf8'
+  const graphqlOpenPullRequests = loadFixture(
+    __filename,
+    'graphql/pullrequest-1.json'
   );
-  const graphqlClosedPullRequests = fs.readFileSync(
-    'lib/platform/github/__fixtures__/graphql/pullrequests-closed.json',
-    'utf8'
+  const graphqlClosedPullRequests = loadFixture(
+    __filename,
+    'graphql/pullrequests-closed.json'
   );
 
   describe('initPlatform()', () => {
diff --git a/lib/platform/utils/pr-body.spec.ts b/lib/platform/utils/pr-body.spec.ts
index ab0b3a7cfe..873b125299 100644
--- a/lib/platform/utils/pr-body.spec.ts
+++ b/lib/platform/utils/pr-body.spec.ts
@@ -1,15 +1,9 @@
-import fs from 'fs-extra';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { smartTruncate } from './pr-body';
 
+const prBody = loadFixture(__filename, 'pr-body.txt');
+
 describe(getName(__filename), () => {
-  let prBody: string;
-  beforeAll(async () => {
-    prBody = await fs.readFile(
-      'lib/platform/utils/__fixtures__/pr-body.txt',
-      'utf8'
-    );
-  });
   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 440d4b82ac..ef98dedc3d 100644
--- a/lib/platform/utils/read-only-issue-body.spec.ts
+++ b/lib/platform/utils/read-only-issue-body.spec.ts
@@ -1,15 +1,9 @@
-import fs from 'fs-extra';
-import { getName } from '../../../test/util';
+import { getName, loadFixture } from '../../../test/util';
 import { readOnlyIssueBody } from './read-only-issue-body';
 
+const issueBody = loadFixture(__filename, 'issue-body.txt');
+
 describe(getName(__filename), () => {
-  let issueBody: string;
-  beforeAll(async () => {
-    issueBody = await fs.readFile(
-      'lib/platform/utils/__fixtures__/issue-body.txt',
-      'utf8'
-    );
-  });
   describe('.readOnlyIssueBody', () => {
     it('removes all checkbox formatting', () => {
       expect(readOnlyIssueBody(issueBody)).toEqual(
diff --git a/lib/workers/branch/auto-replace.spec.ts b/lib/workers/branch/auto-replace.spec.ts
index 0bf06f454b..125d9237d3 100644
--- a/lib/workers/branch/auto-replace.spec.ts
+++ b/lib/workers/branch/auto-replace.spec.ts
@@ -1,15 +1,10 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'upath';
-import { defaultConfig, getName } from '../../../test/util';
+import { defaultConfig, getName, loadFixture } from '../../../test/util';
 import { WORKER_FILE_UPDATE_FAILED } from '../../constants/error-messages';
 import { extractPackageFile } from '../../manager/html';
 import type { BranchUpgradeConfig } from '../types';
 import { doAutoReplace } from './auto-replace';
 
-const sampleHtml = readFileSync(
-  resolve(__dirname, `../../manager/html/__fixtures__/sample.html`),
-  'utf8'
-);
+const sampleHtml = loadFixture(__filename, 'sample.html', `../../manager/html`);
 
 jest.mock('../../util/fs');
 
diff --git a/lib/workers/pr/changelog/release-notes.spec.ts b/lib/workers/pr/changelog/release-notes.spec.ts
index aca57ac8c4..f28f25f667 100644
--- a/lib/workers/pr/changelog/release-notes.spec.ts
+++ b/lib/workers/pr/changelog/release-notes.spec.ts
@@ -1,7 +1,6 @@
-import fs from 'fs-extra';
 import { DateTime } from 'luxon';
 import * as httpMock from '../../../../test/http-mock';
-import { getName, mocked } from '../../../../test/util';
+import { getName, loadFixture, mocked } from '../../../../test/util';
 import * as _hostRules from '../../../util/host-rules';
 import {
   addReleaseNotes,
@@ -16,33 +15,19 @@ jest.mock('../../../util/host-rules');
 
 const hostRules = mocked(_hostRules);
 
-const angularJsChangelogMd = fs.readFileSync(
-  'lib/workers/pr/__fixtures__/angular-js.md',
-  'utf8'
+const angularJsChangelogMd = loadFixture(__filename, 'angular-js.md', '..');
+const jestChangelogMd = loadFixture(__filename, 'jest.md', '..');
+const jsYamlChangelogMd = loadFixture(__filename, 'js-yaml.md', '..');
+const yargsChangelogMd = loadFixture(__filename, 'yargs.md', '..');
+const adapterutilsChangelogMd = loadFixture(
+  __filename,
+  'adapter-utils.md',
+  '..'
 );
-const jestChangelogMd = fs.readFileSync(
-  'lib/workers/pr/__fixtures__/jest.md',
-  'utf8'
-);
-
-const jsYamlChangelogMd = fs.readFileSync(
-  'lib/workers/pr/__fixtures__/js-yaml.md',
-  'utf8'
-);
-
-const yargsChangelogMd = fs.readFileSync(
-  'lib/workers/pr/__fixtures__/yargs.md',
-  'utf8'
-);
-
-const adapterutilsChangelogMd = fs.readFileSync(
-  'lib/workers/pr/__fixtures__/adapter-utils.md',
-  'utf8'
-);
-
-const gitterWebappChangelogMd = fs.readFileSync(
-  'lib/workers/pr/__fixtures__/gitter-webapp.md',
-  'utf8'
+const gitterWebappChangelogMd = loadFixture(
+  __filename,
+  'gitter-webapp.md',
+  '..'
 );
 
 const githubTreeResponse = {
diff --git a/lib/workers/repository/dependency-dashboard.spec.ts b/lib/workers/repository/dependency-dashboard.spec.ts
index 67bf63f17c..35f20a00da 100644
--- a/lib/workers/repository/dependency-dashboard.spec.ts
+++ b/lib/workers/repository/dependency-dashboard.spec.ts
@@ -1,10 +1,10 @@
-import fs from 'fs';
 import { ERROR, WARN } from 'bunyan';
 import { mock } from 'jest-mock-extended';
 import {
   RenovateConfig,
   getConfig,
   getName,
+  loadFixture,
   logger,
   platform,
 } from '../../../test/util';
@@ -239,10 +239,7 @@ describe(getName(__filename), () => {
         config.dependencyDashboardTitle
       );
       expect(platform.ensureIssue.mock.calls[0][0].body).toBe(
-        fs.readFileSync(
-          'lib/workers/repository/__fixtures__/master-issue_with_8_PR.txt',
-          'utf8'
-        )
+        loadFixture(__filename, 'master-issue_with_8_PR.txt')
       );
       expect(platform.getBranchPr).toHaveBeenCalledTimes(0);
       expect(platform.findPr).toHaveBeenCalledTimes(0);
@@ -282,10 +279,7 @@ describe(getName(__filename), () => {
         config.dependencyDashboardTitle
       );
       expect(platform.ensureIssue.mock.calls[0][0].body).toBe(
-        fs.readFileSync(
-          'lib/workers/repository/__fixtures__/master-issue_with_2_PR_edited.txt',
-          'utf8'
-        )
+        loadFixture(__filename, 'master-issue_with_2_PR_edited.txt')
       );
       expect(platform.getBranchPr).toHaveBeenCalledTimes(2);
       expect(platform.getBranchPr.mock.calls[0][0]).toBe('branchName1');
@@ -335,10 +329,7 @@ describe(getName(__filename), () => {
         config.dependencyDashboardTitle
       );
       expect(platform.ensureIssue.mock.calls[0][0].body).toBe(
-        fs.readFileSync(
-          'lib/workers/repository/__fixtures__/master-issue_with_3_PR_in_progress.txt',
-          'utf8'
-        )
+        loadFixture(__filename, 'master-issue_with_3_PR_in_progress.txt')
       );
       expect(platform.getBranchPr).toHaveBeenCalledTimes(3);
       expect(platform.getBranchPr.mock.calls[0][0]).toBe('branchName1');
@@ -382,10 +373,7 @@ describe(getName(__filename), () => {
         config.dependencyDashboardTitle
       );
       expect(platform.ensureIssue.mock.calls[0][0].body).toBe(
-        fs.readFileSync(
-          'lib/workers/repository/__fixtures__/master-issue_with_2_PR_closed_ignored.txt',
-          'utf8'
-        )
+        loadFixture(__filename, 'master-issue_with_2_PR_closed_ignored.txt')
       );
       expect(platform.getBranchPr).toHaveBeenCalledTimes(0);
       expect(platform.findPr).toHaveBeenCalledTimes(2);
@@ -443,10 +431,7 @@ describe(getName(__filename), () => {
         config.dependencyDashboardTitle
       );
       expect(platform.ensureIssue.mock.calls[0][0].body).toBe(
-        fs.readFileSync(
-          'lib/workers/repository/__fixtures__/master-issue_with_3_PR_in_approval.txt',
-          'utf8'
-        )
+        loadFixture(__filename, 'master-issue_with_3_PR_in_approval.txt')
       );
       expect(platform.findPr).toHaveBeenCalledTimes(0);
 
diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts
index 1edb6aa299..d457c3a565 100644
--- a/lib/workers/repository/process/lookup/index.spec.ts
+++ b/lib/workers/repository/process/lookup/index.spec.ts
@@ -1,12 +1,11 @@
 import nock from 'nock';
-import { getConfig, getName, mocked, partial } from '../../../../../test/util';
-import qJson from '../../../../config/npm/__fixtures__/01.json';
-import helmetJson from '../../../../config/npm/__fixtures__/02.json';
-import coffeelintJson from '../../../../config/npm/__fixtures__/coffeelint.json';
-import nextJson from '../../../../config/npm/__fixtures__/next.json';
-import typescriptJson from '../../../../config/npm/__fixtures__/typescript.json';
-import vueJson from '../../../../config/npm/__fixtures__/vue.json';
-import webpackJson from '../../../../config/npm/__fixtures__/webpack.json';
+import {
+  getConfig,
+  getName,
+  loadJsonFixture,
+  mocked,
+  partial,
+} from '../../../../../test/util';
 import { CONFIG_VALIDATION } from '../../../../constants/error-messages';
 import * as datasourceDocker from '../../../../datasource/docker';
 import { id as datasourceDockerId } from '../../../../datasource/docker';
@@ -29,7 +28,25 @@ jest.mock('../../../../datasource/docker');
 jest.mock('../../../../datasource/git-refs');
 jest.mock('../../../../datasource/github-releases');
 
-qJson.latestVersion = '1.4.1';
+const fixtureRoot = '../../../../config/npm';
+const qJson = {
+  ...loadJsonFixture(__filename, '01.json', fixtureRoot),
+  latestVersion: '1.4.1',
+};
+const helmetJson = loadJsonFixture(__filename, '02.json', fixtureRoot);
+const coffeelintJson = loadJsonFixture(
+  __filename,
+  'coffeelint.json',
+  fixtureRoot
+);
+const nextJson = loadJsonFixture(__filename, 'next.json', fixtureRoot);
+const typescriptJson = loadJsonFixture(
+  __filename,
+  'typescript.json',
+  fixtureRoot
+);
+const vueJson = loadJsonFixture(__filename, 'vue.json', fixtureRoot);
+const webpackJson = loadJsonFixture(__filename, 'webpack.json', fixtureRoot);
 
 const docker = mocked(datasourceDocker) as any;
 docker.defaultRegistryUrls = ['https://index.docker.io'];
diff --git a/test/util.ts b/test/util.ts
index 06f596fb1e..e45057b9d2 100644
--- a/test/util.ts
+++ b/test/util.ts
@@ -1,5 +1,7 @@
 import crypto from 'crypto';
+import { readFileSync } from 'fs';
 import { expect } from '@jest/globals';
+import upath from 'upath';
 import { getConfig } from '../lib/config/defaults';
 import type { RenovateConfig as _RenovateConfig } from '../lib/config/types';
 import * as _logger from '../lib/logger';
@@ -44,6 +46,30 @@ export function getName(file: string): string {
   return name;
 }
 
+export function loadFixture(
+  currentFile: string,
+  fixtureFile: string,
+  fixtureRoot = '.'
+): string {
+  const callerDir = upath.dirname(currentFile);
+  const fixtureAbsFile = upath.join(
+    callerDir,
+    fixtureRoot,
+    '__fixtures__',
+    fixtureFile
+  );
+  return readFileSync(fixtureAbsFile, { encoding: 'utf8' });
+}
+
+export function loadJsonFixture<T = any>(
+  currentFile: string,
+  fixtureFile: string,
+  fixtureRoot = '.'
+): T {
+  const rawFixture = loadFixture(currentFile, fixtureFile, fixtureRoot);
+  return JSON.parse(rawFixture) as T;
+}
+
 /**
  * Can be used to search and replace strings in jest snapshots.
  * @example
-- 
GitLab