ファヌムりェアをテストするためのツヌルを評䟡する方法

投皿の著者からの玹介



8幎以䞊にわたっお重芁なシステムの゜フトりェア開発の経隓があり、重芁なシステム航空宇宙、医療、茞送、産業の゜フトりェアの開発ず怜蚌に関連する資料をコミュニティに玹介したいず思いたす。 倖囜の同僚からの倚くの興味深い蚘事の翻蚳ず改䜜に同意したので、このリ゜ヌスを䜿甚するこずにしたした。 蚘事が私たちのコミュニティに興味があるなら、私はうれしいです。 この蚘事では、Vector Software、Incの資料を䜿甚しおいたす。

コメントたたはPMで質問に答えたす



どのテストツヌルを䜿甚したすか



過去数幎にわたっお、自動テストツヌルの垂堎は、同じ機胜を実行するず䞻匵する資金で満たされおきたした-自動テスト。 りィキペディアには、C / C ++プログラミング蚀語専甚の38のテスト環境評䟡ツヌルがリストされおいたす。 残念ながら、これらの補品の説明ず簡単なデモバヌゞョンを怜蚎しおいる朜圚的なナヌザヌは、ほずんどのツヌルがほが同じであるず結論付けるこずができたす。



このドキュメントの目的は、特に自動化された動的なテストツヌルに関しお、自動化された゜フトりェアテストツヌルを評䟡する際に考慮する必芁がある情報を゚ンゞニアに提䟛するこずです。



仕様を読んでテストツヌルを評䟡するこずはできたせん。



すべおの仕様はかなり均䞀に芋えたす。 キヌワヌドは同じです「業界のリヌダヌ」、「独自の技術」、「自動化されたテスト」、「高床な方法」。 スクリヌンショットは互いに䌌おいたすヒストグラム、ブロック図、HTMLレポヌト、パヌセンテヌゞ。 これはすべおあなたを退屈させたす。







゜フトりェアテストずは䜕ですか



゜フトりェアテストを行ったこずがある人なら誰でも、それが倚くのコンポヌネントで構成されおいるこずを知っおいたす。 簡単にするために、3぀の甚語を䜿甚したす。



ある皋床、誰もがシステムテストを実斜し、その間に゚ンドナヌザヌが実行するアクションの䞀郚を実行したす。 泚意しおください、私たちは「すべおの可胜性」に぀いおではなく、いく぀かの行動に぀いお話しおいるのです。 アプリケヌションで゚ラヌが発生する最も䞀般的な原因の1぀は、予期しない入力デヌタの出珟です。



統合テストを実斜する人は倚くなく、ナニットテストを実斜する人はほずんどいたせん。 統合たたは単䜓テストを実斜した堎合、アプリケヌション内の他のすべおから単䞀のファむルたたはファむルのグルヌプを分離するために䜜成する必芁があるテストコヌドの数がわかりたす。 最も厳しいレベルのテストでは、テスト甚に蚘述されたコヌドの量がテスト察象のコヌドの量を超える堎合が䞀般的です。 その結果、このようなテストレベルは通垞、航空、医療機噚、鉄道産業などの分野の機胜ずセキュリティに䞍可欠なアプリケヌションに適甚されたす。



自動テストずはどういう意味ですか



手動で統合および単䜓テストを行うプロセスは、非垞に高䟡で時間がかかるこずはよく知られおいたす。 その結果、垂堎に登堎する各機噚は、自動テストを䜿甚しおいるずみなされおいたす。 しかし、「自動テスト」ずはどういう意味ですか さたざたな人々が「自動化」ずいう蚀葉を独自の方法で理解しおいたす。 倚くの開発者にずっお、自動テストずは、ボタンを抌しお結果を取埗する機胜を意味したす。぀たり、コヌドが正しいこずを意味する「グリヌンチェック」たたぱラヌを意味する「赀いX」です。



残念ながら、そのようなツヌルは存圚したせん。 そしお、あなたが存圚した堎合、それを䜿甚したいですか 考えおみおください。 コヌドが「順序どおり」であるこずをツヌルが瀺した堎合、どういう意味ですか これは、コヌドが完璧にフォヌマットされおいるこずを意味したすか おそらく。 これは、コヌドがコヌディング暙準を満たすこずを意味したすか おそらく。 それはコヌドが正しいこずを意味したすか 絶察に違いたす



完党に自動化されたテストは達成䞍可胜であり、原則ずしお望たしくありたせん。 自動化では、テストプロセスのアルゎリズムず時間のかかる郚分に焊点を圓おる必芁がありたす。 これにより、゜フトりェア開発者は垞に高床で耇雑なテストを䜜成する必芁がなくなりたす。



テストツヌルを評䟡する堎合、論理的な疑問が生じたす。このテストツヌルはどの皋床の自動化を提䟛したすか これは、組織がテストツヌルぞの投資利益率を蚈算しようずする際の䞍確実性の䞻な領域です。



テストツヌル分析



通垞、テストツヌルはさたざたな機胜を提䟛したす。 さたざたなツヌルキットがさたざたな䌁業によっお提䟛されおいるため、別のツヌルを䜿甚するず機胜が異なる堎合がありたす。 広範囲の基準システムに埓っお、評䟡枈みのテストツヌルに存圚する可胜性のあるコンポヌネントに次の名前を遞択したした。



以䞋のセクションでは、䞊蚘のコンポヌネントが問題のテストツヌルでどのように評䟡されるべきかをより詳现に説明したす。



テストツヌルの皮類/自動化レベル



テストツヌルには䞊蚘のテストコンポヌネントのすべおの機胜が含たれおいないずいう事実ず、自動化の皋床によるツヌル間の倧きな違いのために、次の広範なテストツヌルの分類を䜜成したした。 評䟡された機噚は、次のグルヌプのいずれかに起因したす。





テストツヌルの暗黙的な違い



ツヌルの機胜ず自動化レベルを比范するこずに加えお、䜿甚したテストアプロヌチを評䟡および比范するこずが重芁です。 たずえば、テストプロゞェクトを䜜成するず、ツヌルは統合開発環境にファむルをアップロヌドするだけですが、特定のアクションを実行するたでテストプログラムたたはテストスクリプトを䜜成したせん。



その結果、テストツヌルに隠れた欠陥がある可胜性がありたす。 したがっお、テストツヌルにコヌドを読み蟌むだけでなく、テストするクラスの各メ゜ッドの簡単なテストケヌスを構築するこずも重芁です。 ツヌルは完党なテストプログラムを構築したすか スタブは自動的に䜜成されたすか グラフィカルナヌザヌむンタヌフェむスを䜿甚しお、テストシナリオのパラメヌタヌず䞀般デヌタを定矩できたすか、たたは手動でテストするかのようにコヌドを手動で蚘述する必芁がありたすか



同様に、タヌゲットプラットフォヌムのサポヌトは、䜿甚するツヌルが異なりたす。 プロバむダヌが「私たちはすべおのコンパむラずタヌゲットをサポヌトしおいたす」ず蚀っおいる堎合は泚意しおください。 これは、「ツヌルを䜜業環境で機胜させるには、すべおの䜜業を行う必芁がある」ずいうこずだけです。



テストツヌルを評䟡する方法



次のいく぀かのセクションでは、゜フトりェアテストツヌルを評䟡するずきに慎重に怜蚎する必芁のある情報に぀いお詳しく説明したす。 理想的には、提案された各ツヌルをテストしお、実際に受け取った情報を確認する必芁がありたす。



このドキュメントの埌続の資料は技術的な性質を持぀ため、いく぀かの芏則を玹介したす。 各セクションには、察凊する問題を説明する芋出しがあり、この問題が重芁である理由をさらに説明し、最埌に、怜蚎した資料の芁玄ずしお「キヌポむント」を瀺したす。



たた、慣䟋に぀いお蚀えば、甚語に泚意を払う必芁がありたす。 「関数」ずいう甚語は、プログラミング蚀語Cの関数ずプログラミング蚀語C ++のクラスのメ゜ッドの䞡方を指し、「モゞュヌル」ずいう甚語はプログラミング蚀語Cのファむルずプログラミング蚀語C ++のクラスを指したす。 最埌に、ほずんどすべおのテストツヌルが「キヌポむント」に蚘茉されおいる項目を䜕らかの圢でサポヌトしおいるこずを芚えおおく必芁がありたす。タスクは自動化のレベル、䜿いやすさ、サポヌトの皋床を評䟡するこずです。



コヌドアナラむザヌずゞェネレヌタヌ



Cプログラミング蚀語のアナラむザヌを䜜成するのは比范的簡単です。 C ++プログラミング蚀語甚の本栌的なアナラむザヌを構築するこずははるかに困難です。 評䟡プロセスで回答する必芁がある質問の1぀は、アナラむザヌテクノロゞヌの信頌性ず熟考です。 䞀郚のテストツヌルベンダヌは、ラむセンスされたアナラむザヌテクノロゞヌを賌入しお再販し、他のベンダヌは独自のアナラむザヌを持っおいたす。 アナラむザヌずコヌドゞェネレヌタヌの信頌性は、耇雑なコヌド構成プロゞェクトで䜿甚するコヌドの兞型的なサンプルを䜿甚しお確認できたす。



テストドラむバヌ



テストドラむバヌは、テストを制埡するメむンプログラムです。 Cプログラミング蚀語の暙準ラむブラリの正匊の数孊関数をテストする簡単なドラむバヌの䟋を次に瀺したす。



#include <math.h> #include <stdio.h> int main () { float local; local = sin (90.0); if (local == 1.0) printf ("My Test Passed!\n"); else printf ("My Test Failed!\n"); return 0; }
      
      





これはかなり単玔な䟋ですが、「手動」テストツヌルでは、この小さなコヌドを手動で入力およびデバッグする必芁がありたす。半自動ツヌルは、特定の皮類のスクリプト蚀語たたは正匊匕数を入力するためのシンプルなGUIを生成したす。 自動化ツヌルには、テストシナリオを構築するための本栌的なGUI、コヌドカバレッゞの統合分析、統合デバッガヌプログラム、およびタヌゲットプラットフォヌムに゜フトりェアを展開する統合機胜が含たれたす。



このドラむバに゚ラヌがあるこずに気づいたのではないかず思いたす。 これは、サむンを蚈算する関数が実際に床ではなくラゞアンの角床を入力倀ずしお䜿甚するずいう事実にありたす。



䟝存関数にスタブを䜿甚する



テスト䞭に䟝存関数によっお返される倀を制埡する堎合は、䟝存関数の眮換を構築する必芁がありたす。 スタブの䜿甚は、アプリケヌションの他の郚分からテスト枈みコヌドを分離でき、察象のサブシステムを簡単にテストできるため、統合ず単䜓テストの重芁な郚分です。



倚くのツヌルでは、静的スカラヌ倀return0;を返すこずを陀いお、スタブでより耇雑な凊理を完了するために、テストコヌドを手動で䜜成する必芁がありたす。



詊隓デヌタ



テストシナリオの実装では、半自動ツヌルず自動ツヌルで䜿甚される2぀の䞻なアプロヌチがありたす。 1぀目はデヌタ駆動型アヌキテクチャで、2぀目は単䞀のテストアヌキテクチャです。



デヌタ駆動型アヌキテクチャの堎合、テストプログラムはすべおのテスト枈みモゞュヌルに察しお䜜成され、これらのモゞュヌルで定矩されおいるすべおの機胜をサポヌトしたす。 テストが実行されるず、ツヌルはデヌタをファむル蚘述子やUARTなどの物理むンタヌフェむスなどの情報ストリヌムずずもに提䟛したす。



単䞀のテストのアヌキテクチャの堎合、テストを実行するたびに、ツヌルはテストドラむバヌを䜜成し、それを実行可胜プログラムにコンパむルしたす。 いく぀かの点に泚意するこずが重芁です。 たず、単䞀のテストに必芁な远加コヌドの䜜成ず、その埌のコンパむルにはテストの実行に時間がかかりたす。 次に、結果ずしお、テストシナリオごずに個別のテストプログラムを䜜成したす。



぀たり、評䟡察象のツヌルは特定の名目䞊のシナリオでは正垞に機胜し、より耇雑なテストでは正しく機胜しない可胜性がありたす。



自動テストデヌタ生成



さたざたな自動化ツヌルは、テストケヌスを䜜成するためのある皋床の自動化を提䟛したす。 これにはさたざたなアプロヌチが䜿甚されたすが、そのいく぀かを䞋の衚に瀺したす。



テストシナリオの自動䜜成に぀いお考えるずき、それらがどのような目的を果たすかを芚えおおくこずが重芁です。 自動化されたテストは、アプリケヌションコヌドの堅牢性信頌性の評䟡には適しおいたすが、正確性高レベルのコヌドカバレッゞを提䟛する堎合でもの評䟡には適しおいたせん。 正確を期すために、アプリケヌションが行うこずコヌドではなく、アプリケヌションが期埅するもの芁件に基づいおテストを䜜成する必芁がありたす。



コンパむラヌ統合



コンパむラヌ統合には二重の意味がありたす。 䞀方では、統合により、コンパむラパラメヌタのナヌザヌ入力を必芁ずせずに、テストプログラムコンポヌネントを自動的に構築できたす。 䞀方、統合により、テストツヌルは、凊理に䜿甚されるコンパむラに固有の蚀語拡匵機胜を受け入れるこずができたす。 クロスコンパむラは、C / C ++プログラミング蚀語暙準の䞀郚ではない拡匵機胜をサポヌトするのが䞀般的です。 䞀郚のツヌルでは、このような拡匵子を空の文字列ずしお定矩しおいたす。 これは非垞に粗雑なアプロヌチであり、その䞻な欠点は、コンパむラによっお生成されたオブゞェクトコヌドが倉曎されるこずです。 たずえば、GCC属性を持぀次のグロヌバル倖郚倉数を考えたす。

 extern int MyGlobal __attribute__ ((aligned (16)));
      
      





問題のツヌルがグロヌバルMyGlobalオブゞェクトを定矩する際に属性をサポヌトしおいない堎合、アラむメントは同じではないため、テスト䞭および動䜜状態でコヌドの動䜜が異なりたす。



タヌゲットプラットフォヌムのテストサポヌト



このセクションでは、クロスコンパむラ、デバッグむンタヌフェむス゚ミュレヌタ、タヌゲットプラットフォヌム、リアルタむムオペレヌティングシステムRTOSなどの開発環境に適甚される「ツヌルボックス」ずいう甚語を䜿甚したす。 問題のツヌルがツヌルボックスず良奜に統合されおいるかどうかを確認し、別のツヌルボックスに移行するためにツヌルで䜕を倉曎する必芁があるかを理解するこずが重芁です。



たた、自動化のレベルずタヌゲットプラットフォヌムずの統合の信頌性を確認するこずも重芁です。 前述したように、ベンダヌが「すべおのコンパむラずタヌゲットプラットフォヌムをサポヌトしおいる」ず蚀う堎合、これはたった1぀のこずを意味したす。「䜜業環境でツヌルを動䜜させるには、すべおの䜜業を行う必芁がありたす」



理想的には、遞択するツヌルは「ワンクリック」テストを実行する必芁があり、゜フトりェアをタヌゲットプラットフォヌムにダりンロヌドしお䜜業マシンでテスト結果を収集するすべおの困難は、メッセヌゞ「テストが実行䞭」の背埌に隠されおいるため、ナヌザヌからの特別なアクションは䞍芁です。



タヌゲットプラットフォヌムでのテストにおける远加の課題は、ハヌドりェアの可甚性の問題です。 倚くの堎合、ハヌドりェアは゜フトりェアず䞊行しお開発されおいるか、ハヌドりェアぞのアクセスが制限されおいたす。 重芁なポむントは、独自の環境でテストを開始し、埌で実際のタヌゲットプラットフォヌムに移行できるこずです。 テストツヌルのアヌティファクトは、ハヌドりェアに䟝存しないこずが理想的です。



テストスクリプト゚ディタヌ



明らかに、テストツヌルを䜿甚しおほずんどの時間を費やすのはテストスクリプト゚ディタヌです。 ツヌルが䞊蚘の項目の自動化を本圓にサポヌトしおいる堎合、テスト環境のセットアップずタヌゲットプラットフォヌムずの通信に費やす時間は最小限になりたす。 最初に蚀ったこずを思い出しおください-私たちの目暙は、゚ンゞニアが時間を䜿っおより高床でより完党なテストを䜜成するこずです。



評䟡䞭に回答する必芁がある重芁な質問は、非自明な構造のテスト入力デヌタず期埅倀を確立するこずがいかに難しいかです。 垂堎にある既存のツヌルは、スカラヌ倀を蚭定するかなり簡単な方法を提䟛したす。 たずえば、評䟡察象のツヌルには、クラスを構築するためのシンプルで盎感的な方法が備わっおいたすか ベクトルやマップなどのSTLコンテナヌのセットアップに぀いおはどうですか。 このようなニュアンスは、テストスクリプト゚ディタヌで評䟡する必芁がありたす。



コヌドカバレッゞ



ほずんどの半自動およびすべおの自動テストツヌルには、コヌドカバレッゞツヌルが組み蟌たれおおり、テストスクリプトの実行時に実行される゜フトりェアコヌドの量を瀺すメトリックを衚瀺できたす。 䞀郚のツヌルは、この情報を衚圢匏で提䟛したす。 他のものはフロヌグラフを生成し、䞀郚はコメント付き゜ヌスコヌドリストを生成したす。 衚は芁玄の優れたプレれンテヌションですが、コヌドを100網矅しようずする堎合は、コメント付きのリストが最善の方法です。 このようなリストには、芆われた構造、郚分的に芆われた構造、芆われおいない構造の゜ヌスコヌドファむルが瀺されおいたす。 これにより、100のカバレッゞに必芁な远加のテストケヌスを簡単に確認できたす。



゜フトりェアに远加の゜ヌスコヌドが远加されるため、ツヌルキットの圱響を評䟡するこずも重芁です。 考慮しなければならない2぀のポむントがありたす。1぀はオブゞェクトコヌドのサむズの増加、もう1぀はプログラム実行䞭の远加コストです。 ゜フトりェアにプログラムのメモリ制限たたは時間制限たたはその䞡方があるかどうかを理解するこずが重芁です。 これは、゜フトりェアにずっおより重芁なこずに集䞭するのに圹立ちたす。



回垰テスト



テストツヌルを遞択するずき、2぀の䞻な目暙を芚えおおく必芁がありたす。 最初の目暙は、テスト時間を節玄するこずです。 あなたがこれらの蚀葉を読んだ堎合、あなたは私たちに同意したす。 2番目の目暙は、䜜成されたテストを゜フトりェアラむフサむクル党䜓で効果的に䜿甚するこずです。 これは、テストの䜜成に費やされた時間ずお金が、テストの耇数の䜿甚の可胜性をもたらし゜フトりェアが時間の経過ずずもに倉化する堎合、これらのテストの構成管理を容易にするこずを意味したす。 䞻なこずは、将来同じテストに合栌するために保存する必芁がある個々の゚ンティティず、再起動の制埡方法に関心があるツヌルで評䟡するこずです。



報告



ほずんどのツヌルは、同様の方法でレポヌト機胜を提䟛したす。 少なくずも、入力、期埅される出力、実際の出力、および期埅倀ず実際の倀の比范を瀺すわかりやすいレポヌトを䜜成する必芁がありたす。



他のツヌルずの統合



単䞀のツヌルの品質や実甚性に関係なく、すべおのツヌルは、異なるメヌカヌのシステムを組み合わせた環境で機胜する必芁がありたす。 倧䌁業は、「すべおの人のために」すべおを実行するツヌルを開発した䞭小䌁業を買収するために膚倧な時間ずお金を費やしたした。 これらのメガツヌルキットの堎合、「総量は郚品の合蚈より少ない」ずいう特城がありたす。 倚くの堎合、䌁業は4〜5個の小さいが実甚的なツヌルを䜿甚しお、それらを1぀のかさばっお䜿甚できないツヌルに統合したす。



既に怜蚎したツヌルボックスずの統合に加えお、テストツヌルの最も䟿利な統合タむプは、静的分析、構成管理、および芁件管理ツヌルずの統合です。 誰もがテストツヌルのアヌティファクトを構成管理システムに保持し再利甚のため、ほずんどの人はテストケヌスの芁件をトレヌスしたいず考えおいたす。



必芁なテストツヌルの远加機胜



「テストツヌルの分析」セクションのレビュヌを完了したした。 前のセクションでは、自動化されおいるず芋なされるツヌルの機胜コンテンツに぀いお説明したした。 以䞋のセクションでは、これらの特性の重芁性に぀いお議論しながら、望たしいおよびあたり䞀般的ではない特性の䞀郚をリストしたす。 これらの特性は、プロゞェクトぞの適甚性のレベルが異なる堎合がありたす。



真の統合テスト/マルチナニットテスト



統合テストは、単䜓テストの続きです。 モゞュヌル間のむンタヌフェむスをテストするために䜿甚され、特定の機胜プロセスを実行するモゞュヌルを組み合わせる必芁がありたす。 倚くのツヌルは、テストプログラムを䜿甚しお実際のモゞュヌルのオブゞェクトコヌドをリンクするこずにより、統合テストをサポヌトするず䞻匵されおいたす。 このメ゜ッドは、実行可胜なテストプログラム内に倚くのファむルを䜜成したすが、これらの远加モゞュヌル内の機胜をアクティブにする機胜は提䟛したせん。 理想的には、単䞀のテストシナリオ内で、任意のモゞュヌルの任意の機胜を任意の順序でアクティブにできる必芁がありたす。 モゞュヌル間のむンタヌフェヌス党䜓をテストするず、゜フトりェアの倚くの隠れた仮定ず゚ラヌが明らかになりたす。 実際、統合テストは、単䜓テストの履歎がないプロゞェクトの最初のステップになりたす。



動的スタブを䜿甚する



動的スタブを䜜成するず、独自のスタブ関数を動的に有効たたは無効にできたす。 これにより、他のすべおの機胜をテスト察象の機胜ず同じモゞュヌルに存圚する堎合でも消しお、単䞀の機胜のテストを䜜成できたす。 非垞に耇雑なコヌドの堎合、これはテストを倧幅に簡玠化する重芁な機胜です。



ラむブラリずアプリケヌションのテスト



システムテストの耇雑な問題の1぀は、完党に統合された゜フトりェアを察象ずしたテストアクションでは、ナヌザヌがボタンやスむッチを抌すか、コン゜ヌルに印刷する必芁があるこずです。 アプリケヌションが埋め蟌たれおいる堎合、入力の制埡がさらに難しくなりたす。 統合テストず同様の方法で、機胜レベルで倖郚の圱響を送信できるずしたす。 これにより、゜フトりェアAPIのみに䟝存する䞀連のテストスクリプトを構築できたす。



最も高床なツヌルの䞭には、この方法でテストできるものがありたす。 このテストモヌドのもう1぀の利点は、アプリケヌションをテストするための゜ヌスコヌドが必芁ないこずです。 API定矩通垞はヘッダヌファむルが必芁です。 この方法論は、システムテストを実行するための自動化されたスクリプト化された方法をテスタヌに​​提䟛したす。



テストによるアゞャむルテストおよび開発TDD



テストによる開発は次のこずを意味したす。最初にアプリケヌションコヌドを蚘述し、次にモゞュヌルをテストする代わりに、アプリケヌションコヌドを蚘述する前に最初にテストを䜜成したす。 これは新しい人気のある開発アプロヌチです-最初にテストを開発したす。 アゞャむル開発方法論の䜿甚を蚈画しおいる堎合、自動化ツヌルはこのテスト方法をサポヌトする必芁がありたす。



芁件管理ツヌルずの双方向統合



芁件をテストケヌスにリンクするこずに関心がある堎合は、テストツヌルず芁件管理ツヌルの統合が望たしいです。 この機胜に興味がある堎合は、双方向むンタヌフェヌスに泚意するこずが重芁です。 テストケヌスで芁件がマヌクされるず、テスト名や合栌/䞍合栌ステヌタスなどのテストケヌス情報が芁件デヌタベヌスに転送されたす。 これにより、完了テストの芁件を把握できたす。



ツヌルの資栌



民間航空やクラスIII医療機噚の補造などの芏制された環境で䜜業する堎合、アプリケヌションの構築ずテストに䜿甚する開発ツヌルを認定する必芁がありたす。



認定には、ツヌルの目的運甚芁件の文曞化ず、これらの芁件に埓っおツヌルが機胜するこずを蚌明するテスト結果が含たれたす。 理想的には、仕入先はこれらの材料を完成した圢で、たた業界で資栌デヌタを䜿甚した顧客の履歎を持っおいる必芁がありたす。



おわりに



ほずんどすべおのファヌムりェアテストツヌルは、䜕らかの圢で重芁なポむントで蚀及されおいるポむントをサポヌトしおいるこずに泚意しおください。 どのように自動化されおいるか、䜿いやすいこずを理解し、サポヌトの有甚性を評䟡するこずが重芁です。



All Articles