Firebase 是常用的后端解决方案之一,在前端中也有其专属的 JavaScript 库 - Firebase JavaScript SDK。在使用 Firebase SDK 进行前端开发过程中,你可能会需要在项目开发过程中进行单元测试、集成测试以及端到端测试等。@firebase/testing 就是为我们提供了这些测试的一组工具。
在这篇文章中,我们将学习如何使用 npm 包 @firebase/testing 进行测试。包含以下方面:
- 安装、引入 @firebase/testing 包
- 初始化一个测试环境
- 编写测试用例
安装、引入 @firebase/testing 包
首先,我们需要安装 @firebase/testing 包,以及必要的 Firebase SDK 包以及要使用的测试框架。在前端开发中,我们一般会选择 Jest 作为我们的测试框架。
下面是一些常用包的安装命令:
# 安装 @firebase/testing 包 npm install --save-dev @firebase/testing # 安装 Firebase SDK 包 npm install firebase # 安装 Jest 测试框架以及相关测试库 npm install jest @types/jest ts-jest --save-dev
接下来,我们需要创建一个名为 jest.config.js
的文件,并在其中添加以下内容:
module.exports = { preset: 'ts-jest', testEnvironment: 'node' };
这个配置告诉 Jest 我们使用 TypeScript (preset: 'ts-jest'
)和在命令行中运行的测试环境是基于 Node.js 的(testEnvironment: 'node'
)。
我们还需要为 TypeScript 配置 Jest, 创建 tsconfig.json
文件,并添加以下配置:
{ "compilerOptions": { "target": "es2017", "module": "commonjs", "esModuleInterop": true, "types": ["jest"] } }
typescript 的 target,module 等配置见个人 main.py
安装好所需的 npm 包后,我们就可以引入我们需要的包,写下如下代码:
import { initializeTestApp, loadFirestoreRules } from '@firebase/testing'; import firebase from 'firebase/app'; import 'firebase/firestore';
initializeTestApp 是 Firebase 提供的测试 SDK,loadFirestoreRules 函数用于加载我们的 Firestore 规则。这些规则在测试中非常重要,可以为我们提供一些保证。firebase/firestore 是我们使用的库。
初始化一个测试环境
现在,我们已经准备好开始我们的测试了。在这个测试中,我们创建一个测试环境,将其清空,然后添加一些数据并进行测试。下面,我们会从头开始演示如何初始化我们的测试环境。
- Step 1: 定义测试的 Firestore 规则
在我们的测试脚本开始之前,我们需要定义我们的 Firestore 规则。我们可以创建一个名为 firestore.rules 的文件,加入以下内容:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read, write: if false; } }
这个规则禁用了所有读写操作,除非我们在测试时显式的为其进行授权。
- Step 2: 加载规则并初始化测试环境
我们需要为我们的测试场景准备一个没有数据的测试环境,以便于每个测试都从一个定义好的起点开始。我们可以通过使用 initializeTestApp 初始化一个 Firebase 应用程序,并将其指定为测试用例的上下文:
-- -------------------- ---- ------- ------------ ------- --------- ------ -- -- - --- ---- ----------------- --- --- ----------------------------- -- ------- --------------- -- -- - ----- --------- - ----------------------------------- --- - ------------------- ---------- --- -- - ---------------- ----- -------------------- --------- --- --- -- ------ --------------- -- -- - ----- -------------------- ---------- --------------------- --- --- -- ------ -------------- -- -- - ----- ------------- --- ---
第一个块代码使用 beforeAll 函数指定在所有测试用例之前运行的初始化代码,任何测试之前仅会被运行一次。我们使用 initializeTestApp
初始化一个 Firebase 应用程序,并指定一个自定义的 project ID。然后我们使用 loadFirestoreRules
加载我们的规则。
必须注意的是,initializeTestApp 返回的实例不是真正的 Firebase 应用程序,而是一个特殊的类型,称为 firebasemock.app.App
。我们需要将其转换为 firebase.app.App
才能与 Firebase API 配合使用。
在初始化测试环境的同时,我们也会定义一些其他的钩子函数。我们会在 afterEach 函数中清空所有的数据,并在 afterALl 函数中关闭我们创建的测试应用。
下一步,我们将编写用于测试的测试用例。
编写测试用例
我们已经有了一个干净的测试环境,现在我们可以编写一些测试用例了。下面是一个用于测试写入数据的基本例子:
test('Write a new document', async () => { const docRef = db.collection('cities').doc('LA'); await firebase.assertSucceeds(docRef.set({ name: 'Los Angeles', state: 'CA', country: 'USA' })); });
这个测试用例用于写入一条名为 "LA" 的城市记录。我们使用 db.collection('cities').doc('LA') 获取了对该文档的引用。然后,我们使用 assertSucceeds
函数来测试 set
方法是否成功。
如果在这个测试运行过程中 set
方法未抛出错误,那么我们将验证通过。
接下来,我们将编写另外一个测试用例,用于测试规则中的 read 权限:
test('Denied read permission', async () => { const docRef = db.collection('cities').doc('SF'); await firebase.assertFails(docRef.get()); });
这里,我们测试集合 'cities' 中名为 'SF' 的文档的读权限。因为我们的规则中禁用了所有的读写操作,我们期望这个测试会失败。
最后,我们将编写能够通过规则的写入测试用例:
test('Allowed write permission', async () => { const docRef = db.collection('approvedUsers').doc('Einstein'); await firebase.assertSucceeds(docRef.set({ profession: 'scientist' })); });
在我们的规则中,写权限需要通过验证,来使文档的数据字段 profession
符合一定的限制。如果这个测试能够通过,说明我们的规则是正常工作的。
到目前为止,我们已经可以在前端项目中使用 @firebase/testing 进行测试了。如果您在采用 Firebase 进行开发,也可以尝试一下使用测试代码添加对 Firebase SDK 全面的测试效验,可以避免我们在发版后出现一些常规错误。
完整的代码可以在此某个高端的代码托管站点查看。
总结
@firebase/testing 提供了一些工具,用于编写前端应用程序的各种类型的测试。我们可以利用这些工具让我们的项目更加健壮、可靠,并且减少出错率。
再次重复,如果您的项目使用 Firebase 进行开发,那么 @firebase/testing 可以是你进行前端自动化测试的加速器。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/firebase-testing