この記事では、Angular での単体テストについて説明し、例を通して単体テスト ツール (Karma Jasmine) の使用方法を紹介します。
私は長年 Angular フロントエンド開発を行ってきましたが、フロントエンドの単体テストをする勇気がありませんでした。 -end はユーザーを扱うため、テストが簡単ではありません。2 番目の理由は、プロジェクトに時間のプレッシャーがあり、単体テストを行うエネルギーがないことです。これは、ビジネスが変化すると、フロントエンド開発中に人間によるテストが必要になることにもつながります。時間もかかるし、専門的な内容もないので、直接的に自分の人生を疑ってしまいます。
最近少し時間があったので、Angular の単体テストを勉強しました。 Angular には実際に独自の単体テスト ツールがあります: Karma Jasmine:
- Karma: Karma は JavaScript コードをテストするための自動テスト管理ツールで、ファイルの変更を監視し、テストを自動的に実行できます。
- Jasmine: Javascript テストを作成するためのフレームワーク。
[関連チュートリアルの推奨事項: 「angular チュートリアル」]
最初のテスト ケース
作成後Angular が適用され、Karma と Jasmine の依存関係が package.json ファイルに追加されました:
"karma": "~1.7.1", "karma-chrome-launcher": "~2.2.0", "karma-coverage-istanbul-reporter": "~2.0.0", "karma-jasmine": "~1.1.1", "karma-jasmine-html-reporter": "^0.2.2",
バックエンド テストを行ったピアはおそらく、これらのコンポーネントの役割分担をすでに知っているでしょう:
- karma: Karma コア コンポーネント
- karma-chrome-launcher: Chrome ランチャー、テストは Chrome で実行されます
- karma-coverage-istanbul-reporter: カバレッジ レポート
- karma-jasmine: Jasmine コア コンポーネント
- karma-jasmine-html-reporter: HTML テスト レポート
src ディレクトリに、karma.conf という名前が表示されます。 .js、test.ts の 2 つのファイル。
karma.conf.js: Karma の設定ファイル。注目する必要がある設定は次のとおりです。
-
frameworks: 使用されるテスト フレームワーク、Jasmine
は次のとおりです。ここで使用されます port: テストで使用されるポート
-
autoWatch: テスト コードの変更を自動的に監視し、テストを自動的に実行するかどうか
plugins: package.json ファイルと一致する、テストで使用されるプラグイン
-
browsers: テストの実行に使用されるブラウザ、Chrome他のブラウザを使用する必要がある場合は、ここで使用されます。npm 経由でブラウザ ランチャーをインストールし、プラグインで設定する必要があります。たとえば、Safari を使用して、
#npm install karma-safari-launcher --save-dev plugins: [ require('karma-safari-launcher') ] browsers: ['Safari'],
test を使用します。 ts: テスト環境を初期化し、すべてのテストを指定するテスト エントリ ファイル ファイル
アプリ ディレクトリには、app.component.spec.ts という名前のファイルもあります。これは Jasmine テストです。内容
import { TestBed, async } from '@angular/core/testing'; import { AppComponent } from './app.component'; //测试入口,参数为测试名、方法 describe('AppComponent', () => { //每个测试用的Setup beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ AppComponent ], }).compileComponents(); })); //测试用例 it('should create the app', async(() => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.debugElement.componentInstance; expect(app).toBeTruthy(); })); it(`should have as title 'test-demo'`, async(() => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.debugElement.componentInstance; //断言,期望值是否满足要求 expect(app.title).toEqual('test-demo'); })); it('should render title in a h1 tag', async(() => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.debugElement.nativeElement; //通过querySelector获取页面元素 expect(compiled.querySelector('h1').textContent).toContain('Welcome to test-demo!'); })); //每个测试用例的TearDown afterEach(function() { //清除测试数据 }); });
上のコードは Jasmine 構文を使用しています。Jasmine の詳細については、JavaScript 単体テスト フレームワーク: Jasmine の予備調査を参照してください。ここでは詳細には触れません。
実行: ng test、上記のファイルのテスト レポートが表示されます:
さらに、テスト レポート内のテストをクリックすることもできます。個別に実行する場合、レポートは次のようになります:
穴埋め
#パイプなどのコンポーネントのテストの場合、サービス、ルーターなどについては、Angular ドキュメントを参照してください。ここでは、テスト中に遭遇したさまざまな落とし穴に焦点を当てます。プロバイダなし ***
テスト中に、テスト対象のコンポーネントが他のサードパーティ コンポーネント、サービス、またはパイプを必要とする場合、導入されていない場合、プロバイダーは表示されません エラー、解決策は非常に簡単です。インポートまたはプロバイダーを使用して beforeEach に導入するだけです:beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ //这里声明 ], imports: [ //这里引入 ], providers: [ //这里引入 ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }) .compileComponents(); }));
リクエスト タイムアウト
開発時、タイムアウトネットワーク上の理由により、非同期リクエストでエラーが発生することがよくあります。通常の解決策は、TimeOut 時間の上限を設定し、TimeOut エラーに対して人間向けのプロンプトを提供することです。 TimeOut エラーはテスト中にも発生します:it('#loadBalance for BCT should return real value', async () => { jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000000; ... })または「TimeOut 時間を均一に設定する」 BeforeEach:
describe("my async specs", function() { var originalTimeout; beforeEach(function() { originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000000; }); ... afterEach(function() { jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; }); });
テスト環境を定義します
Angular のデフォルトでは、開発と製品に異なる環境が提供されます。テストの場合は、環境を設定することもできます。 src/environment の下にenvironment.test.tsを作成し、angular.jsonの内容を変更します:"architect":{ "test":{ ... "configurations": { "test": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.test.ts" } ] } } } }package.jsonファイルを変更します:
"scripts": { "test": "ng test --configuration=test", }次のコマンドを実行します。
npm test //或者 ng test --configuration=testテストを実行する場合、environment.test.ts ファイルに設定された内容が使用されます。
テストデータのロールバック
做过Grails开发的伙计应该知道,单元测试、集成测试后,数据库中的测试数据会通过配置文件清除掉。在前端测试中,测试数据需要自行调用清除代码,对于使用LocalStorage、SessionStorage保持的数据亦是如此,方法很简单,在afterEach添加清除代码:
describe("my async specs", function() { afterEach(function() { //在这里清除测试数据 }); });
与StoryBook的配合
先前我发布了一篇题为《StoryBook实战》的文章,StoryBook也是用来测试组件的,它与Karma+Jasmine有什么区别呢?
二者都能测试的:
Pipe
Servcie
Component
StoryBook不能测、Karma + Jasmine可测试的:
Router
Component的界面元素属性、Input、Output
Karma + Jasmine不能做的,StoryBook能做的:
Component交互测试
组件管理
编写组件文档
从上面可以看出,Storybook进行的是黑盒测试,Karma + Jasmine则注重白盒测试,二者侧重点不同,没有谁强谁弱之分,只有扬长避短,利用好各自的优点,方可让前端测试更完美,将前端bug扼杀在开发阶段。
一些前端测试感悟
虽然前端开发的工作比较繁琐,也是客户Challenge最多的地方,但是不代表前端只有页面,没有架构。以前之所以觉得Angular的单元测试难做,就是觉得都是页面的东西怎么测?其实,终其原因,还是没有架构,所有的代码都集中在Component中,为了赶进度,通过拷贝、粘贴,怎么快怎么来。结果,悲剧了,后期代码维护困难,一点改动就需要人肉测试。
费时不说,开发人员也没有成长。接触Angular前端测试后,我的脑海里又出现了“测试驱动开发”。一段好代码,前提是要易于测试,不管这段代码是用于前端还是后端。 前端开发人员不仅仅要关注页面的易用性、美观性,同样需要关注前端的架构,一个易于测试的架构才是最好的“武器”。
更多编程相关知识,请访问:编程入门!!
以上がAngular での単体テストについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 中国語版
中国語版、とても使いやすい

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック









