1年が経過し、ネットワーク上での作成に関する新しい公開ツールや情報はほとんどありません。 そこで、状況を修正し、独自のカスタムインストゥルメントを作成した方法を共有することにしました。これにより、単体テストの弱い分離の理由が決まります。 これは標識技術に基づいており( 前の記事で説明しました )、テストが点滅する場所を迅速かつ正確に判断できます。

理論的最小値
Xcode用の新しいツールを作成するには、2つの理論的なブロックを理解する必要があります。 自分でそれを理解したい人のために、私たちはすぐに必要なリンクを提供します:
- .instrpkgツールマークアップファイルの構造について
- プログラミングツールロジックのクリップ
残りの部分-必要なトピックの簡単な要約を以下に示します。
最初に[ファイル]-> [新規]-> [プロジェクト]-> [macOSカテゴリ]-> [インストゥルメントパッケージ]を選択します。 作成されたプロジェクトには、拡張子.instrpkgのファイルが含まれます。このファイルでは、新しいツールがxml形式で宣言的に宣言されます。 マークアップ要素について理解しましょう。
なに | 属性 | 説明
|
データスキーマ
| インターバルスキーマ、ポイントスキーマなど
| SQLスキーマのようなテーブル内のデータ構造を記述します。 スキームは、他のマークアップ要素で使用され、たとえばマッピング(UI)を記述するときなど、モデルの入力および出力でデータのタイプを決定します。
|
データスキーマのインポート
| インポートスキーマ
| 既製のスキームをインポートします。 Appleが定義したデータ構造を使用できます。
|
ツールモデル
| モデラー
| ツールを.clpファイルに関連付けます。このファイルでは、ツールのロジックが定義され、モデルの入力および出力で予想されるデータスキームが通知されます。
|
ツールの説明
| 計器
| データモデルを説明し、UIでのイベントの表示方法を決定します。 データモデルは、属性create-table、create-parameterなどを使用して記述されます。 ツールチャートはグラフ属性によって定義され、パーツテーブルはリスト、物語などによって定義されます。
|
新しいツールのロジックを補完する場合は、CLIPSコードで.clpファイルを作成します。 基本的な言語エンティティ:
- 「ファクト」は、assertコマンドを使用してシステムに登録された特定のイベントです。
- 「ルール」は、一連のアクションが実行される条件を含む特定の構文を持つifブロックです。
アクティブになるルールとシーケンスは、着信するファクト、ルールの優先順位、および競合解決メカニズムに基づいて、CLIPS自体によって決定されます。
この言語は、プリミティブに基づくデータ型の作成、算術演算、論理演算および関数の使用をサポートしています。 クラスの定義、メッセージの送信、多重継承を備えた本格的なオブジェクト指向プログラミング(OOP)と同様に。
カスタムツールのロジックを作成できる言語の基本的な構文を検討してください。
1.
fact
を作成するには、
assert
コンストラクトを使用します。
CLIPS> (assert (duck))
したがって、ファクトテーブルにエントリ
duck
が表示され、
facts
コマンドを使用して表示できます。
CLIPS> (facts)
事実を削除するには、
retract
コマンドを使用します:
(retract duck)
2.
rule
を作成するには、
defrule
コンストラクトを使用し
defrule
。
CLIPS> (defrule duck) — duck (animal-is duck)</i> — animal-is duck => (assert (sound-is quack))) — sound-is quack
3.変数を作成して使用するには、次の構文を使用します(変数名の前に必須記号「?」があります)。
?<variable-name>
4.次を使用して、新しいデータ型を作成できます。
CLIPS> (deftemplate prospect (slot name (type STRING) (default ?DERIVE)) (slot assets (type SYMBOL) (default rich)) (slot age (type NUMBER) (default 80)))
そのため、プロスペクトの名前と、対応するタイプの名前、資産、年齢、およびデフォルト値の3つの属性を持つ構造を定義しました。
5.算術および論理演算には接頭辞構文があります。 つまり、2と3を追加するには、次の構成を使用する必要があります。
CLIPS> (+ 2 3)
または、2つの変数xとyを比較するには:
CLIPS> (> ?x ?y)
実用例
このプロジェクトでは、 OCMockライブラリを使用してスタブオブジェクトを作成します。 ただし、mokが作成されたテストよりも寿命が長く、他のテストの分離に影響する場合があります。 その結果、単体テストの「点滅」(不安定性)につながります。 テストとモックの有効期間を追跡するために、独自のツールを作成します。 以下はアクションのアルゴリズムです。
ステップ1.道標イベントのマークアップを作成する
問題のあるmoxを検出するには、間隔イベントの2つのカテゴリが必要です-モカの作成と破棄の時間、テストの開始時間と終了時間。 これらのイベントを取得するには、
OCMock
ライブラリに移動し、
stopMocking
クラスの
init
および
stopMocking
メソッドの
signpost
で
OCMock
アップします。


次に、調査中のプロジェクトに移動し、ユニットテストでマークアップを実行し、
setUp
および
tearDown
を
tearDown
。

ステップ2. Instrument Packageテンプレートから新しいツールを作成する

まず、入力のデータ型を決定します。 これを行うために、
signpost
スキーム
.instrpkg
インポートし
signpost
。 これで、
signpost
によって作成されたイベントはツールに分類されます。

次に、出力のデータのタイプを決定します。 この例では、同時イベントを出力します。 各イベントには時間と説明があります。 これを行うには、スキームを宣言します。

ステップ3.ツールのロジックを説明します
拡張子
.clp
別のファイルを作成し、CLIPS言語を使用してルールを設定します。 新しいツールにロジックが定義されているファイルを知らせるには、
modeler
ブロックを追加します。

このブロックでは、
production-system
属性を使用して、ロジックを含むファイルへの相対パスを指定します。 属性
output
および
required-input
、それぞれ入力および出力のデータスキーム
required-input
定義します。

ステップ4.ツールのプレゼンテーションの詳細を説明します(UI)
.instrpkg
ファイルでは、ツール自体の説明、つまり結果の表示が残ります。
schema-ref
属性で以前に宣言
detected-mocks-narrative
schema-ref
を使用して、
create-table
属性でデータのテーブルを作成します。 そして、情報出力のタイプを設定します-物語(説明):

ステップ5.ロジックコードを書く
エキスパートシステムのロジックを定義する
.clp
ファイルに
.clp
ましょう。 ロジックは次のようになります。テストの開始時刻が真岡の人生の間隔と交差する場合、このモックは別のテストから「来た」と考えられます。これは現在の単体テストの分離に違反します。 最終的に関心のある情報を含むイベントを作成するには、次の手順を実行する必要があります。
1.フィールドを使用してモックとunitTest構造体を定義します-イベントの時間、イベント識別子、テストの名前、mokのクラス。

2.
unitTest
の着信イベントに基づいて、タイプ
mock
および
unitTest
ファクトを作成するルールを定義します。

これらのルールは次のように読むことができます:入力時に、希望する
subsystem
、
category
、
name
、および
event-type
のos-signpostタイプのファクトを取得した場合、上記で定義されたタイプ(unitTestまたはmock)で新しいファクトを作成し、値を入力します。 ここで覚えておくことが重要です-CLIPSは大文字と小文字を区別する言語であり、サブシステム、カテゴリ、名前、イベントタイプの値は、調査中のプロジェクトのコードで使用されたものと一致する必要があります。

標識イベントからの変数の値は、次のように渡されます。

3.完了したイベントをリリースするルールを決定します(結果に影響しないため、冗長です)。

ステップ6.結果を生成するルールを定義します。
このようなルールを読むことができます。
もし
1)unitTestとモックがあります。
2)この場合、テストの開始は既存のmokaより遅くなります。
3)検出されたモックの物語スキーマで結果を保存するためのテーブルがあります。
それから
4)新しいレコードを作成します。
5)時間を記入します。
6)...および説明。

その結果、新しいツールを使用すると次の図が表示されます。

カスタム計測器のソースコードと計測器を使用するためのサンプルプロジェクトは、GitHubで表示できます。
ツールのデバッグ
デバッガーは、カスタムツールのデバッグに使用されます。

彼は許可する
1. instrpkgの説明に基づいてコンパイルされたコードを参照してください。
2.実行時にツールに何が起こるかについての詳細情報を参照してください。

3.新しいツールの入力として使用できるシステムデータスキームの完全なリストと説明を表示します。

4.コンソールで任意のコマンドを実行します。 たとえば、list-defrulesコマンドを使用してルールのリストを表示するか、factsコマンドを使用してファクトを表示します

CIサーバーでのセットアップ
コマンドラインからツールを実行して、CIサーバーでのユニットテストまたはUIテストの実行中にアプリケーションのプロファイルを作成できます。 これにより、たとえば、メモリリークをできるだけ早くキャッチできます。 パイプラインのテストのプロファイルを作成するには、次のコマンドを使用します。
1.属性付きのツールの実行:
xcrun instruments -t <template_name> -l <average_duration_ms> -w <device_udid>
- ここで、
template_name
はツールを含むテンプレートへのパスまたはテンプレートの名前です。 コマンドxcrun instruments -s
取得できます。 -
average_duration_ms
ミリ秒単位の記録時間。テスト実行時間以上である必要があります。 -
device_udid
シミュレーター識別子。 コマンドxcrun Instruments -sを取得できます。 テストが実行されるシミュレータの識別子と一致する必要があります。
2.次のコマンドを使用して、同じシミュレーターでテストを実行します。
xcodebuild -workspace <path_to_workspace>-scheme <scheme_with_tests> -destination <device> test-without-building
-
path_to_workspace
はXcodeワークスペースへのパスです。 -
scheme_with_tests
テスト付きのスキーム。 -
device
-シミュレーター識別子。
その結果、拡張子.traceのレポートが作業ディレクトリに作成されます。これは、Instrumentsアプリケーションで開くか、ファイルを右クリックして[パッケージの内容を表示]を選択することで開くことができます。
結論
道標を本格的なツールにアップグレードする例を見て、CIサーバーの「実行」に自動的に適用し、「点滅」(不安定)テストの問題の解決に使用する方法を説明しました。
カスタム計測器の可能性に飛び込むと、他のどのような場合に計測器を使用できるかをよりよく理解できます。 たとえば、マルチスレッドの問題-スレッドセーフデータアクセスを使用する場所とタイミングを理解するのにも役立ちます。
新しいツールの作成は非常に簡単でした。 しかし、主なことは、数日かけてメカニックとドキュメントを研究して今日作成した後、バグを修正しようとするいくつかの眠れない夜を避けることができるということです。
ソース
- https://developer.apple.com/videos/play/wwdc2018/410/
- https://developer.apple.com/videos/play/wwdc2018/405/
- https://help.apple.com/instruments/developer/mac/current/
- https://help.apple.com/instruments/mac/current/#/devb14 ff aa5
- http://www.clipsrules.net/Documentation.html
- https://medium.com/appspector/building-custom-instruments-package-9d84fd9339b6
- http://desappstre.com/how-to-custom-instruments-xcode/
この記事は、iOS開発者であるAnton Vlasovの@regnoによって書かれました。