ASKUEモゞュヌルの開発ずテスト





ASKUE-゚ネルギヌ資源の監芖ず䌚蚈のための自動システム。 このようなシステムのタスクには、゚ネルギヌ蚈枬デバむスガス、氎、暖房、電気からデヌタを収集し、分析ず制埡に䟿利な圢匏でこれらのデヌタを提䟛するこずが含たれたす。



そのようなシステムは倚くの異なるデバむスずコントロヌラヌを凊理するこずを䜙儀なくされるため、ほずんどの堎合、それらはモゞュヌルベヌスで構築されたす。 少し前たで、蚈量デバむスの1぀ず通信するシステム甚のモゞュヌルを䜜成するように䟝頌されたした䞉盞電子゚ネルギヌメヌタヌ2753 。



ナレヌションの過皋で、コメントがこのように匷調衚瀺されたす。 圌らの唯䞀の目暙は、蚘事を知る過皋で眠らないこずです。




私は長い間自動テストを適甚したいず考えおいたした。 今は良い機䌚だず思いたした。 なぜそう決めたのですか



テストを詊すのにこのケヌスが䟿利なのはなぜですか







自動テストに賭けるこずで、実際に曞く必芁があるコヌドの量を2倍にしたした。 今埌は、デバむス゚ミュレヌタを䜜成する必芁がありたした。 しかし、最終的には䟡倀があったず思いたす。



興味深い結果の1぀は、生きおいるデバむスなしで開発を行うこずができたずいうこずです-手元にそのプロトコルの説明だけがありたす。 もちろん、生きおいるデバむスが登堎したしたが、コヌドの倧郚分が䜜成された埌です。









開発はDelphi 7の環境で実行されたした。自動化されたテストでは、DUnitラむブラリが䜿甚されたした。 バヌゞョン管理システム-Mercurial。 リポゞトリ-BitBucket。



システム内のモゞュヌルの堎所に関するもう少しの情報



モゞュヌルの䞻なタスクは、䜎レベルのプロトコルに埓っおメヌタヌず通信し、この通信の結果をASKUEシステムが理解できる圢匏で提䟛するこずです。 物理通信チャネルは、原則ずしお、その機胜を拡匵するさたざたな皮類のデバむスモデム、むンタヌフェむスコンバヌタヌを備えたCOMポヌトです。 非垞に䞀般的なRS-232 / RS-485の束。 時々TCP / IPが可胜です。 通信チャネルの線成のニュアンスに぀いおは、特別なASKUEモゞュヌルチャネルドラむバが責任を負いたす。



プロトコル自䜓に関しおは、䞀般的に蚀えば、䞀連のバむト圢匏のリク゚ストずレスポンスのシヌケンスです。 ほずんどの堎合、芁求ず応答の埌にチェックサムが続きたす。 もっず具䜓的なこずを蚀うのは難しいです。 この通信方法の最も特城的な代衚はMODBUS仕様です。



MODBUSプロトコルは、灰色の人ず退屈な人の運呜です。 あなたが明るく創造的な人であれば、もちろん、あなたは信頌できる実蚌枈みの゜リュヌションを䜿甚せず、それずはたったく異なる独自のバヌゞョンのプロトコルを考え出しおください。 そしお、この堎合、マヌケティング郚門は、デバむスがMODBUSのようなプロトコルを䜿甚しお通信するこずをデバむスの将来の賌入者を怖がらせないように、広告パンフレットに慎重に曞き蟌みたす。 もちろん-MODBUSずの互換性に぀いおの話はありたせん。




モゞュヌルの内郚構造



モゞュヌルの内郚構造を瀺したす。これは、開発ずリファクタリングを数回繰り返した結果刀明したした。 あなたはそれが非垞にオリゞナルではないこずに気付くかもしれたせん。



メむンのDeviceオブゞェクトには、デバむスでの䞀般的なアクションず、ASKUEデヌタを必芁な圢匏で返すためのコヌドが含たれおいたす。







Deviceオブゞェクトは、耇数のOnlinerオブゞェクトを所有しおいたす。 各Onlinerは、デバむスずの完党に完了した通信セッションを担圓したす。 さたざたなタむプのオンラむンナヌザヌが、デバむスのさたざたな兞型的な操䜜を担圓したす。 最も䞀般的なのは、パラメヌタヌのグルヌプのポヌリングです。 私のデバむスの堎合、パラメヌタヌの6぀のグルヌプがあり、それぞれに独自のOnlinerがありたした。



Onlinerは、䜜業でQueryオブゞェクトを䜿甚したす。 Queryオブゞェクトは、単䞀の芁求応答サむクルを担圓したす。 Queryオブゞェクト操䜜の結果は、デバむスから受信した特定の情報であり、䜿いやすい圢匏に瞮小されたす。 さらに、Queryオブゞェクトは、䞍正で壊れた機噚の応答を認識し、必芁に応じおク゚リを繰り返したす。 このロゞックはク゚リレベルでは非衚瀺であり、Onlinerはこれに぀いお心配しおいたせん。



最䞋䜍レベルはStructオブゞェクトです。 さたざたな䜎レベルのバむト圢匏をプログラミング蚀語で䜿甚される倀に倉換する責任がありたす。 バむトストリヌムがStructオブゞェクトの入力に送られたす-出力では、Integer、Float、String型の倀。 時々ほが垞に、Structオブゞェクトは重芁なこずをしなければなりたせん。 したがっお、Structレベルでは、デヌタのシリアル化ず逆シリアル化の数孊的な䜜業がすべおカプセル化されたす。 圌はこのハヌドワヌクのすべおのニュアンスをより高いレベルから隠しおいたす。



CrcProcessorオブゞェクトも図で匷調衚瀺されおいたす。 その名前によれば、チェックサムの蚈算を担圓したす。 ケヌスは、䞀芋するず思われるほど単玔ではありたせん。



以䞋では、デヌタ倉換Structずチェックサム蚈算CrcProcessorに぀いおもう少し詳しく説明したす。トピックは興味深いものであり、話すべきこずがあるからです。



蚈量デバむスのデヌタ圢匏



メヌタリングデバむスの芁求ず回答にない情報を゚ンコヌドする方法を指定するこずは困難です。



最も無害なのはタむプ党䜓です。 すべおのタむプのアドレス、ポむンタヌ、カりンタヌは、1぀のタむプ党䜓ずしお゚ンコヌドされたす。タヌゲットパラメヌタヌは敎数タむプの堎合もありたす。 特定の敎数型は、バむト長ず、これらのバむトがチャネルを介しお送信される順序が異なりたす。



数孊、たたはむしろ慎重に開発されたセクション-組み合わせ論は、オブゞェクトの順列の数に厳密な制限を蚭定したすn。 たずえば、3バむトは6通りの順序で配眮できたす。 この克服できない量子コンピュヌティングに頌らない堎合理論的限界は、蚈量デバむスのプロトコルの䜜成者をひどく混乱させたす。 3バむトを20通りの方法で送信できた堎合、遅かれ早かれそれぞれのバむトに遭遇するず思いたす。




私の意芋では、固定点を持぀タむプは、蚈枬デバむスで最も成功しおいたす。 この考え方は、小数点を巊に数桁シフトする必芁があるずいう条件で、チャネルを介しお敎数倀を送信するこずです。 さたざたな倉換の䞋で正しく動䜜する非垞に優れたタむプ。 銀行コンピュヌティングの暙準ずしお䜿甚されるほど良い。 VisualBasicに通貚型があるこずを誰かが知っおいる堎合-それはちょうどそのように構成されおいたす。



基本的な型はそのたたなので、リラックスしお組み合わせ論やバむト順序を忘れるこずはできたせん。




もちろん、すべおの点で、倚くの問題は浮動小数点型です。 レシピは1぀しかありたせん-それが䜕を意味するのか、それがどこにあるのか、どのようなオプションがあるのか​​を完党に理解するためです。 そしお再び-バむトオヌダヌに぀いお芚えおおいおください。



浮動小数点型が、プラットフォヌムの暙準型の1぀ず内郚衚珟で偶然に䞀臎するこずを期埅するこずが、障害の高さです。 そのような考えがあなたを蚪ねるなら、あなたはプログラミングをするべきではありたせんが、リスクの少ないクラフト-ルヌレットをプレむする、宝くじを買う、ワヌルドカップに賭けるべきです。




最も興味深いオプションは、通信チャネルでタむムスタンプを送信しようずするずきに発生したす。 日付ず時刻のさたざたな郚分は、最も任意の圢匏で送信されたす。



幎、月、日、時間、分、秒の順序は、すべお同じ理論䞊の限界nに自信を持っお努力しおいたす。 あなたはただその幎に぀いおいく぀かの蚀葉を蚀うこずができたす。 2000幎の問題は誰にも䜕も教えなかったため、ほずんどの堎合、幎は2桁で送信されたす。





倚くの堎合、プロトコルを介しお送信されるバむトストリヌムは、さたざたなマむクロ回路タむマヌ、ADC、ポヌト、レゞスタの内郚メモリの盎接ダンプです。



マむクロチップを䜜成する人は、各ビットの泚意深い䜿甚に぀いお倚くを知っおいたす。 したがっお、個々のビットずビットのセットを任意の堎所からカットアンドペヌストし、接着し、マスクを適甚し、さたざたな方向にシフトし、実際のプログラマヌの仕事が䞀連の顔のない日になるような倚くのこずを行う必芁があるずいう事実に備えおください互いの䞊に。





ほずんどの圢匏に泚意したしたが、これはすべおの埮劙な点からはほど遠いです。 最も予期せぬ瞬間に、プロトコルによる通信をたったく新しいレベルに匕き䞊げる特別な手法を適甚できたす。 たずえば、BCDバむナリ10進圢匏などの゚キゟチックなものや、ASCII文字による数倀の送信を適甚できたす。 同じ倀の郚分が異なる芁求で送信される堎合がありたすたずえば、倀の党䜓を取埗するには、デバむスに1぀の芁求を送信し、郚分的な芁求を取埗する必芁がありたす。



私が䌚ったこずのない唯䞀のこずは、囜別文字のUTF圢匏での送信です。 しかし、それは善意の問題ではないず思いたすが、UTFでの䜜業はリ゜ヌス集玄型のビゞネスであり、マむクロコントロヌラヌのリ゜ヌスは限られおいるずいう事実です。





䞊蚘のすべおが、数癟のデバむスを䜿甚した私の膚倧な経隓の結果であるず思われる堎合、これに反論する必芁がありたす。 これのほずんどすべおはメヌタヌで出䌚ったので、そのためにモゞュヌルを曞きたした。 信じられない人のために、私はデバむスにパスポヌトずプロトコルの説明を送るこずができたす。 あなたは私が曞いたすべおが真実であるこずがわかりたす。



チェックサム蚈算



䞊で述べたように、チェックサムに぀いおも、䞀芋するず思えるほど単玔ではありたせん。 CRC8、CRC16、CRC32ずいう確立された甚語があるずいう事実にもかかわらず、それらはチェックサムがどのように考慮されるべきかを明確に理解しおいたせん。 したがっお、垞に埮劙な違いが生じたす。 通信プロトコルの䜜成者自身がこれを知っおおり、プロトコル蚘述で暙準ぞの参照を瀺しおいたせんが、チェックサムの蚈算方法を瀺すコヌド!!!を通垞Cで提䟛したす。



CRC蚈算を共有ラむブラリに入れるこずはお勧めしたせん。 アルゎリズムが耇数のケヌスで䞀臎する堎合でも、い぀かCRCカりントに぀いお完党に気が倉になるバリアントに出くわすでしょう。 小さなコピヌペヌストを行う必芁がある堎合でも、各デバむスに独自のアルゎリズムを䜜成するこずをお勧めしたす。



私のデバむスの堎合、䜕らかの理由で、CRCをカりントするシヌケンスに芁求の最初のバむトを含めるべきではありたせん。 プロトコルの説明にある短いメモに泚意を払ったこずは、倧きな成功だず思いたす。 そうしないず、デバむスずの接続を確立できなくなるからです。 どうやら、私は間違いのない最初のバむトの蚌人の掻動に出䌚いたした。 別の方法で、これをすべお説明するこずはできたせん。





モゞュヌルテストスキヌム



モゞュヌルの内郚構造ずその開発のいく぀かの機胜に぀いお説明したしたが、次にモゞュヌルのテストスキヌムを玹介したす。 このスキヌムはオブゞェクトの構造を繰り返したせんが、情報フロヌの論理スキヌムずその怜蚌を反映しおいたす。 これは蚘事の䞭で最も重芁な数字だず思うので、これに぀いお詳しく説明したす。







最初は、これはかなり独創的なスキヌムであるように思われたしたが、それから私の叀い研究所の知識から生たれたこずに気付きたした情報理論にはいく぀かのコヌスがありたした。





ゞェネレヌタヌは参照倀を生成しお保存し、デバむスの擬䌌゚ミュレヌタヌによっお受け入れられ、䜎レベルのプロトコルに倉換したす。 プロトコルはモゞュヌルによっお認識され、参照倀はそこから埩元されたす。 倀がテスト環境に返されたすデバむスモゞュヌルの堎合は、ASKUEのように芋えたす。 次に、テスト環境はモゞュヌルから取埗した倀を参照倀ず比范したす。 比范に基づいお、モゞュヌルの正垞性に぀いお結論が出されたす。



赀で匷調衚瀺されおいる2぀のモゞュヌルは、ストレステストに関連しおいたす。 特に、通信䞍足、切断、パケット歪みの状況を再珟できたす。 䞻なタスクは、デバむスぞの繰り返しリク゚ストのメカニズム、および予期しない状況の堎合のメモリの正しい割り圓おず解攟を確認するこずですこれはメモリリヌク監芖ナニットによっお監芖されたす。



リファレンスゞェネレヌタヌ



それほど耇雑ではありたせんが、重芁なナニットは参照倀ゞェネレヌタヌです。 ゞェネレヌタヌの本質は、枬定されたASKUEパラメヌタヌの倀を取埗するこずです。 この倀は、䞀方では倉化し、予枬䞍胜良奜な分垃を持぀であり、他方では決定論的぀たり、゚ラヌを効率的に怜玢できるようにするために、テストごずに再珟可胜である必芁がありたす。



考えすぎずに、これはある皮のハッシュ関数であるべきこずが明らかになりたす。 私自身の自転車モデルで少し実隓しお、最終的にMd5を台無しにしたした。 仕事に関する苊情はありたせん。 以䞋はDelphiのコヌドです。



function TFECoreEmulator.GenNormalValue(const pTag:string):double; var A,B,C,D:longint; begin TFECoreMD5Computer.Compute(A,B,C,D,pTag+FE_CORE_EMULATOR_SECURE_MIX); result:=0; result:=result+Abs(A mod 1000)/1E3; result:=result+Abs(B mod 1000)/1E6; result:=result+Abs(C mod 1000)/1E9; result:=result+Abs(D mod 1000)/1E12; end; function TFECoreEmulator.ModelValueTag(const pGroupNotation, pParamNotation: string; const pStartTime, pFinishTime: TDateTime):string; begin result:=pGroupNotation+'@'+pParamNotation+'@'+DateTimeToStr(pStartTime)+'@'+DateTimeToStr(pFinishTime); end;
      
      







単玔な倉換の結果ずしお、通垞の倀0..1を取埗したす。これは必芁な範囲に到達し、軜いハヌトで゚ミュレヌタに送信したす。 い぀でも、倀は絶察粟床で再珟できたす。



擬䌌゚ミュレヌタヌデバむス



擬䌌゚ミュレヌタの䞻な目的は、デバむスずの通信モゞュヌルからの芁求に察する応答を生成するこずです。 私たちは本圓の゚ミュレヌションに぀いお話しおいないので、圌は「擬䌌」ですそれは恩知らずで圹に立たない仕事でしょう。 圌がしなければならないこずは、特定の芁求に察する特定の回答を䜜成するこずです。 さらに、パラメヌタヌ倀が必芁な堎合、圌は参照倀のゞェネレヌタヌを䜿甚したす。



その䞭に異垞なものは䜕もありたせん。答えを圢成するための特別なスキヌムにのみ泚目したす。 最初に思い浮かぶのは、リク゚ストを解析しおレスポンスを生成するための特定の手順通垞はParseずいう名前です。 しかし、実際の実装では、この手順は信じられないほどのサむズに成長し、堎合によっおは、互いに匷く埋め蟌たれおいたす。



だから私は少し違うこずをしたした。







゚ミュレヌタにヘルパヌオブゞェクトのセットを提䟛したした—レプリカに名前を付けたした。 各レプリカは、他のレプリカずは別にリク゚ストを解析しようずしたす。 芁求が圌女に適甚されないこずを理解するずすぐに、圌女は䟋倖をスロヌし、゚ミュレヌタは分析のために芁求を次のレプリカに枡したす。 したがっお、リク゚ストの各バリアントのコヌドを個別のオブゞェクトにロヌカラむズするこずができたした。 単䞀のレプリカが機胜しおいない堎合は、デバむスモゞュヌルたたぱミュレヌタヌのいずれかに゚ラヌがありたす。



たた、Structオブゞェクト構造の情報の゚ンコヌドおよびデコヌド方法を教えたずCrcProcessorを再利甚したこずもわかりたす。 もちろん、これは信頌性の芳点から行うべきではありたせん。 しかし、私はこの劥協を蚱しおくれるず思いたす。



信頌性の芳点から、テスト察象のオブゞェクトずテストむンフラストラクチャで共通のコヌドを䜿甚しないでください゚ラヌは盞互に補償できるため。 オブゞェクトずそのテストは、䞀般に異なる人々によっお曞かれおいるこずが望たしいです。 そしお、圌らはお互いに぀いお䜕も知らないこずが望たしく、䌚議で握手をしないでください。 ご存知のように、私はこのすべおを単独で曞きたしたが、同様の方法論は利甚できたせんでした。




ストレス発生噚



ストレスゞェネレヌタヌは、モゞュヌルずデバむス゚ミュレヌタヌの間のギャップに含たれおいたす。 圌は次のこずができたす。



回答が䞭断された堎合、問題が発生したした-回答を䞭断する堎所。 すべおのヘッダヌずプリアンブルが送信され、モゞュヌルが実際のデヌタを埅機する堎合、最も重芁な堎所で回答を䞭断したした。 すべおのヘルパヌオブゞェクトが既に䜜成されおいるはずです。 この堎所で送信を䞭断するず、メモリリヌクの可胜性が最倧になりたす。



ラむブデバむスを操䜜する過皋で、非垞に興味深い゚ラヌに遭遇したした。デバむスの応答は、チェックサムが䞀臎する堎合でも、すべおのルヌルを正匏に満たしたす。 ただし、デヌタ自䜓は芁求されたものず䞀臎したせん。 特にこのケヌスでは、デバむスの内郚゚ラヌず呌ばれる別のモヌドを導入したした。



長い熟考の末、どうすればこれができるのかずいうず、デバむスは単にリク゚ストの敎合性を制埡しないずいう結論に達したした。 たた、マニュアルに倚く蚘茉されおいるチェックサムは、デバむス自䜓ずは芋なされたせん。 したがっお、芁求が歪められた堎合たずえば、芁求されたメモリのアドレスが倉曎された堎合、玔粋なハヌトを持぀デバむスは正垞なフォヌムを圢成したすが、誀った応答をしたす。





メモリ割り圓お制埡



正しいメモリ割り圓おに぀いおモゞュヌルをテストした方法を少し説明したす。 倚くのこずが明らかであり、誰にも知られおいたすが、ずにかくお話ししたす。 これのいく぀かは興味深いかもしれたせん。



長い間、プログラマは倜のメモリ割り圓おに関連する悪倢を抱えおいたす。 ガベヌゞコレクタを備えたJavaずDotNetの発明により、状況は倚少改善されたした。 しかし、悪倢はただ残っおいるず思いたす。 それらは単により掗緎され掗緎されたものになりたした。




䟋倖メカニズムに基づいた最新の゚ラヌ凊理システムは非垞に䟿利です。 しかし、リ゜ヌスの割り圓おず解攟のプロセスは非垞に耇雑です。 これは、䟋倖が発生するず、プロシヌゞャの実行が䞭断されるためです。 䟋倖は、条件、ルヌプ、ルヌチン、およびモゞュヌルの境界を簡単に克服したす。 そしおもちろん、プロシヌゞャの最埌にリ゜ヌスを解攟するためのコヌドは、特別な措眮が講じられない限り実行されたせん。



この問題を解決するために、人類の最高の心が投げ出されたした。 その結果、try..finallyコンストラクトが発明されたした。 この蚭蚈は、ガベヌゞコレクタを備えたシステムでも行われたす。これは、リ゜ヌスがメモリだけでなく、たずえば開いおいるファむルでもある可胜性があるためです。



ケヌスの叀兞的なアプリケヌションスキヌム-リ゜ヌスの堎合-オブゞェクトは次のようになりたす。



 myObject:=TVeryUsefulClass.Create; try ... VeryEmergenceProcedure; ... finally myObject.Free; end;
      
      







しかし、私はこの方法がより奜きですコヌドに関係するすべおのオブゞェクトを䞀床に凊理でき、さらに、い぀でもどこでもオブゞェクトを䜜成できたす。



 myObject1:=nil; myObject2:=nil; try ... myObject1:=TVeryUsefulClass.Create; ... VeryEmergenceProcedure; ... myObject2:=TVeryUsefulClass.Create; ... VeryVeryEmergenceProcedure; ... finally myObject1.Free; myObject2.Free; end;
      
      







適切なメモリ管理のレシピは単玔です-リ゜ヌスが割り圓おられ、䟋倖が発生する可胜性がある堎合はい぀でも、try..finallyスキヌムを適甚したす。 しかし、䞍泚意は簡単に忘れたり、䜕か間違ったこずをしたりしたす。 したがっお、テストするこずをお勧めしたす。



私は次のようにしたした。 圌はすべおのオブゞェクトの共通の祖先を䜜成し、䜜成時にそれらを䞀般リストに登録し、砎棄時にリストから自身を削陀したした。 最埌に、怜出されおいないオブゞェクトのリストがチェックされたす。 このそれほど耇雑ではないスキヌムには、オブゞェクトを識別し、コヌド内でそれが䜜成された堎所を芋぀けるのに圹立぀いく぀かの芁玠が远加されおいたす。 このため、オブゞェクトには䞀意のラベルが割り圓おられ、䜜成ず削陀の瞬間がトレヌスファむルに衚瀺されたす。



 var ObjectCounter:integer; ObjectList:TObjectList; ... TFECoreObject = class (TObject) public ObjectLabel:string; procedure AfterConstruction; override; procedure BeforeDestruction; override; end; ... procedure TFECoreObject.AfterConstruction; begin inc(ObjectCounter); ObjectLabel:=ClassName+'('+IntToStr(ObjectCounter)+')' ObjectList.Add(self); Trace('Create object '+ObjectLabel) end; ... procedure TFECoreObject.BeforeDestruction; begin ObjectList.Delete(self); Trace('Free object '+ObjectLabel) end; ... procedure CheckObjects; var i:integer; begin for i:=0 to ObjectList.Count-1 do Trace('Bad object '+(ObjectList[i] as TFECoreObject).ObjectLabel); end;
      
      







最も目の肥えた読者は、これがすでにガベヌゞコレクタヌの初期のメカニズムであるず蚀うでしょう。 もちろん、ガベヌゞコレクタヌは遠く離れおいたす。 これは良い劥協だず思いたす。 コヌドのスロヌダりンに気づきたせんでした。 さらに、䜜業アセンブリで条件付きコンパむルディレクティブを䜿甚しお、このメカニズムを無効にするこずができたす。





このメカニズムには欠点がありたす-私の共通の祖先から生成されおいないオブゞェクトの䜜成を監芖するこずはできたせん。 原則ずしお、これらは暙準ラむブラリオブゞェクトTStringList、TObjectListなどです。 オブゞェクトのコンストラクタヌでのみ䜜成し、デストラクタで砎棄するずいうルヌルを䜜成したした。 そしお、テストはすでにオブゞェクトを監芖しおいたす。 すべおを泚意深く行うず、゚ラヌの可胜性が最小限に抑えられたす。



3時間のストレステストのどこかで、重芁な堎所をすべお特定し、try..finallyを正しい方法で配眮したした。



基準粟床



コンピュヌタヌの時点で、たた、察数定芏の時点で、信頌できる小数点以䞋3桁のみを人に小数点以䞋14桁でダンプするのは悪いず考えられおいたした。したがっお、ASKUEシステムでは、各パラメヌタヌに粟床を蚭定できたす。 すべおのパラメヌタヌに぀いお、それは異なり、デバむスずの通信モゞュヌルによっお決定されたす。 倀がどのように圢成され、どのような蚱容粟床が保蚌されるかを知っおいるのは圌だけです。 䞻な䜜業が完了した埌、私は実隓しお、モゞュヌルの最倧胜力を粟床の芳点から芋぀けるこずにしたした。



なぜこれをしおいるのですか おそらくそれはすべお自然の奜奇心に関するものです。 目の前で魔法のようなこずが起こるのを芋たした。 参照倀は、これたで芋たこずのないcなフォヌマットにパックされ、魔法の杖の波で、実際に灰から埩元されたす。 そしお、魔法の杖を持っおいるなら、い぀も少し振っおみたい。 奜奇心がい぀か私を台無しにするず思う。





したがっお、倀のタむプごずに、蚱容粟床を倉曎し始めたした。 詳现に぀いおは説明したせんが、1぀のケヌスに぀いおのみ説明したす。 私は、粟床の限界の感じによれば、テストがただ十分だったずきに、テストが萜ち始めたこずに気付きたした。



少し調べおみたずころ、いく぀かの堎所でTruncを䜿甚しお、魂のシンプルさを仕䞊げたした。 Roundに眮き換えたずころ、限界粟床はすぐに1桁向䞊したした。



友人、数字を䞞めるには、もちろんRoundずRoundToを䜿甚する必芁がありたす。 数孊的な芳点から芋るず、Trunc関数はばかげた、䞍正な倉換です。 Truncは、発明された1぀の堎合にのみ䜿甚する必芁がありたす。敎数郚分ず分数郚分の分離です。 他のすべおの堎合-ラりンド。 それ以倖の堎合、Vosはマむナヌな、堎合によっおはメゞャヌなトラブルに盎面したす。





ラむブデバむスぞの接続



䞊で蚀ったように、䜜業の倧郚分が終わったずきにこのデバむスに接続したした。 デバむスをRS-485経由で接続する必芁があるこずを知ったので、私はずおも幞せでした。 結局のずころ、2本のワむダしかありたせん。 私の埌ろに無線電子機噚のパむオニアサヌクルがあるので、どうにかしお2本のワむダに察凊できるず思いたした。 むンタヌフェむスコンバヌタヌずデバむスを接続しようずしたずきに、連絡先の指定を読んだ埌、私は長い困惑に陥った写真を芋぀けたした。







正匏な論理の芳点から、状況に解決策がないこずを理解したので、むンタヌネットを調べるこずにしたした。



私は玠朎で玠朎な人です。 私はそれぞれの新しいプロゞェクトを、良さの勝利ず暙準の䞍可䟵性を信じお開始したす。 そしお、い぀も残酷な倱望が私を襲いたす。 最悪の堎合、これは時々繰り返されたす。 人生は私に䜕も教えおくれたせん。





むンタヌネットでは、Aがマむナスずプラスの䞡方を接続するず蚀われおいたした。 それはすべお補造業者に䟝存したす。 そのような混乱があった堎合、間違った接続で、少なくずも䜕も燃やすべきではないず刀断したした。 私はこれを詊したした。 すべおがうたくいきたした。



もちろん、実際のデバむスはプロゞェクトに倚くの改善をもたらしたした。 実際の通信セッションは、圌らの堎所に倚くを眮きたした。 倧きな倉曎は、゚ラヌ凊理ずストレステストに圱響を䞎えたした。 特に、ワ​​むダレスモデム経由でデバむスに接続した堎合ほが3分の1の回答が歪んでいたした。



おわりに



深刻なテスト

ASKUEモゞュヌルの開発ずテストに関する私の短い話に興味を持っおいただけたこずを願っおいたす。 私がテストを怜蚎する最も重芁なこず。 補品の品質はそれに盎接䟝存したす。 プロゞェクトに加えられ、テストで確認されおいないすべおの倉曎は、時間ず劎力の無駄です。 結局のずころ、コヌドのわずかな倉曎で、テストされおいない問題が䜕床も返されたす。



私の仕事はTDD方法論テストによるテスト駆動開発開発に觊発されたした。 しかし、もちろん、玔粋なTDDでは成功したせんでした。 ここに私がしなかったこずがありたす





プロゞェクトで䜕が起こったのか、モゞュラヌたたは統合に起因するテストの皮類がわかりたせん。 これはサブシステムの受け入れテストだず思いたす。



コメントを読んだ埌、私が人生に぀いお䞍平を蚀っおいるず思わせたくありたせん。 それどころか、これがたさにプログラミングを䞖界で最も興味深い掻動にしおいる理由です。 たた、蚈枬デバむスの䜜成者がすべおを心に留めおいないこずをお願いしたす。 むンタヌフェむスの反察偎では、人生も面癜いこずを知っおいたす。 私の皮肉はすべお自分自身に向けられおいたす。


皆様に楜しいプログラミングをお祈りしたす。



All Articles