質問への回答
分散スケジューリングシステムの手動テストは、異種システム間の状態管理の複雑さから生まれました。コアの問題は、時間論理、リソースロック機構、およびサードパーティAPI統合が、夏時間の遷移やネットワーク分断といったエッジケースにおいて整合性を維持できるかを検証することです。私の体系的な方法論は、タイムゾーンデータベースの境界分析から始まり、アプリケーションが単純なGMTオフセットではなく、Olsonタイムゾーン識別子を正しく処理することを確認し、「春の前進」と「秋の後退」の曖昧な時間を特にテストします。
次に、複数のブラウザセッションを使用して同時予約試行をシミュレートし、最後の利用可能なリソーススロットに対する競合テストを行い、HTTP 409 Conflictレスポンスや静かなオーバーブッキングを監視します。外部カレンダーの同期については、iCalendar(ICS)ペイロードの生成を検査するために中間者プロキシを使用し、RRULE(繰り返しルール)がUTCタイムスタンプおよびTZIDパラメータで正しくシリアライズされることを検証し、Exchange Web Services(EWS)およびGoogle Calendar APIがデータ損失を避けるために、完全なリソース置換ではなくHTTP PATCHメソッドでキャンセルの更新を処理することを確認します。
実生活からの状況
HealthBridge Medicalでは、州境を越えて専門家とビデオセッションを予約できるテレサイキアトリープラットフォームを立ち上げたため、HIPAA準拠のビデオルームとデジタル処方箋の自動配分が必要でした。秋のDST遷移中にカリフォルニアのセラピストの2:30 PMスロットが二重予約された重大な欠陥が発生しました。これは、システムが曖昧な時間の二つの有効なインスタンスを作成したためであり、Google Calendarは異なるTZID処理により、2つ目のインスタンスを3:30 PMとして解釈しました。
私たちはDSTの異常を解決するために三つの異なるアーキテクチャソリューションを評価しました。最初のアプローチでは、すべてのアポイントメントがUTCとローカルタイムゾーンのデータの両方を保存することを義務付け、プレゼンテーション層でのみ変換を行いました。この方法はデータベースクエリを簡素化しましたが、夏時間の境界を越える繰り返しアポイントメントに対して脆弱であることが判明しました。なぜなら、夏と冬のインスタンスは同じローカルタイムに対して異なるUTCオフセットを必要とし、結果としてGoogle Calendarのインポートが半年間誤った時間を表示する原因となったからです。
二番目のアプローチは、ローカル表示のためにのみフローティングタイム(タイムゾーンなし)を利用し、ユーザーのデバイスに正しく時間を解釈させることを信頼しました。これは静的なユーザーのための変換エラーを排除しましたが、異なるタイムゾーンに旅行した患者が、プロバイダーの場所ではなく現在の場所に基づいてフローティングタイムを自動変換したため、重要なアポイントメントを逃す原因となりました。さらに、Microsoft Exchangeは、いくつかのレガシー構成でフローティングタイムをUTCとして解釈し、西海岸のアポイントメントに対して三時間のオフセットエラーを引き起こしました。
最終的に、すべての発生を元の意図されたローカル時間および特定のIANAタイムゾーン識別子を格納するアンカータイムスタンプを実装する第三のアプローチを選択しました。サーバーがその時点でのtzデータベースのルールを使用して動的に発生を計算します。この戦略は、DST遷移中の事前計算エラーを防ぎましたが、異なる繰り返しパターンを使用しているOutlookアポイントメントとの既存の競合を検出する際に複雑さをもたらしました。この方法を選択した理由は、将来のタイムゾーン法の変更に関係なく、意味的な正確性を維持できたためです。事前計算されたインスタンスは、国がDSTを廃止した場合に不正確になる可能性があります。
この実装により、タイムゾーンに関連する二重予約が完全に排除され、次回のDST遷移中に外部カレンダーとの同期精度が99.97%に達しました。デプロイ後の監視では、「欠落した時間」バグのインスタンスは確認されず、手動回帰テストにより、Exchangeリソースメールボックスがキャンセル後に装置を2秒以内に正しく解放し、その結果として発生していたリソースのデッドロックを防止していることが確認されました。
候補者が見落としがちな点
修正された(例外のある)繰り返しアポイントメントをどうやってテストしますか?シリーズマスターが更新されたときに無限ループやデータ破損を引き起こすことなく。
候補者はよくハッピーパスの繰り返しシリーズのみをテストしますが、例外処理の複雑さを見落とします。手動で週次の繰り返しシリーズを作成し、その後に一つのインスタンスを異なる時間に変更(例外を作成)し、別のインスタンスを削除してからシリーズマスターの時間を更新する必要があります。例外が元の相対的オフセットや特定のオーバーライドを維持することを確認し、削除されたインスタンスは再生成されることなく削除されたままであることを確認してください。
また、シリーズマスターを異なるタイムゾーンに移動したときに何が起こるかをテストします。例外は、基本的には元のローカル時間を保持するべきです。これは、ICSエクスポートにおけるRECURRENCE-IDフィールドが元のインスタンスのタイムスタンプと一致することを確認する必要があり、修正された時間ではなく、外部カレンダー(Outlookなど)が例外をその元の発生スロットと正しく照合できるようにする必要があります。
キャンセルされたときにリソースの解放が正しく行われることをどうやって検証しますか?特に限られた可用ウィンドウを持つ特定の機器について。
これは、ソフトデリートとハードデリートのシナリオを含む完全なライフサイクルをテストする必要があります。火曜日の朝、唯一の利用可能なEEG機器を占有するアポイントメントを作成し、UIを通じてキャンセルした後、異なる患者でそのスロットをすぐに予約しようとします。リソースがACIDトランザクション整合性のもとで利用可能に見えることを確認し、同時セッションでのファントムリードが発生しないことを確認します。
微細なバグは、キャンセルがローカルデータベースを更新しますが、ネットワークタイムアウトによりMicrosoft Exchangeのリソースメールボックスに伝播できないときに発生します。そのため、アプリケーションでは解放されているがOutlookでは予約されている状態になります。リソースが本当に解放されたかどうかを確認するためにEWSのGetUserAvailability呼び出しを通じて確認し、外部同期が失敗し、ローカルトランザクションが成功した場合の補償ロジックをテストします。システムが両方をロールバックするか、再試行をキューに入れる必要があり、不整合の状態を放置しないことを確認する必要があります。
外部カレンダーAPIがレート制限を強制する場合(Google Calendarは、1日に約10億のクォータ単位を許可しますが、バーストトラフィックを制限します)や、古いキャッシュデータを返す場合のテストはどのように行いますか?
手動テスターはよく、HTTP 429 Too Many RequestsやHTTP 503 Service Unavailableレスポンスに対するレジリエンステストを見落とします。複数のアポイントメントを迅速に作成および修正することでレート制限をシミュレートし、アプリケーションが指数バックオフを実装しているか、データ損失で失敗しているかを観察する必要があります。UIが適切な読み込みステータスを表示し、クォータの補充を待っている間に重複した送信を防ぐことを確認してください。
古いデータのシナリオでは、アポイントメントを直接Google Calendarで変更し(アプリをバイパス)、その後アプリで同期をトリガーします。外部の変更を検出するための競合解決アルゴリズムがETagの比較または同期トークンを介して機能することを確認し、古いローカル状態で上書きすることがないようにします。外部カレンダーが重要な予約中に一時的に利用できなくなった場合のシナリオを特にテストし、システムは予約を失うことなく同期をキューに入れ、後で調整することができる必要があります。