金融の基幹システムを1年半かけて .NET 6に移行した話

120.7K Views

August 26, 22

スライド概要

profile-image

「持続可能なソフトウェア」の探求がライフワーク。C#、.NET、WPFあたりが住処。Microsoft MVP for Development Technologies(2017/01〜)。

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

金融の基幹システムを 1年半かけて .NET 6に移行した話 Atsushi Nakamura Copyright 2022 @nuits_jp

2.

.NET 6 migration of a financial company's mission-critical system. About Me Copyright 2022 @nuits_jp

3.

About Me 中村 充志 / Atsushi Nakamura • • • • リコージャパン株式会社 所属 Enterprise(おもに金融)系SIerのITアーキテクト 「持続可能なソフトウェア」の探求がライフワーク .NET界 朝活部 日本支部長 • Blog • Twitter http://www.nuits.jp https://zenn.dev/nuits_jp @nuits_jp Copyright 2022 @nuits_jp Slide 3

4.

.NET 6 migration of a financial company's mission-critical system. Today's Materials Copyright 2022 @nuits_jp

5.

Today's Materials 金融の基幹システムを1年半かけて .NET 6に移行した話 https://zenn.dev/nuits_jp/articles/2022-08-26-migration-to-net6 Twitterの@nuits_jpアカウントから#csharptokyoハッシュタグをつけ てリンクを投稿します。 ついでにフォローしてってください! Copyright 2022 @nuits_jp Slide 5

6.

.NET 6 migration of a financial company's mission-critical system. Agenda Copyright 2022 @nuits_jp

7.

Agenda 1. プロダクト概要 2. プロジェクト概要 3. 顧客をどう説得したか 4. テスト戦略 5. 炎上 Copyright 2022 @nuits_jp Slide 7

8.

Agenda 1. プロダクト概要 2. プロジェクト概要 3. 顧客をどう説得したか 4. テスト戦略 5. 炎上 Copyright 2022 @nuits_jp Slide 8

9.

Agenda 1. 炎上 2. プロダクト概要 3. プロジェクト概要 4. 顧客をどう説得したか 5. テスト戦略 Copyright 2022 @nuits_jp Slide 9

10.

.NET 6 migration of a financial company's mission-critical system. 炎上 Copyright 2022 @nuits_jp

11.

炎上 • TextFieldParser ⇒ CsvHelper移行 Copyright 2022 @nuits_jp Slide 11

12.

炎上 外部システム① 本システム • TextFieldParser ⇒ CsvHelper移行 Copyright 2022 @nuits_jp 外部システム② 障害 Slide 12

13.

炎上 外部システム① 本システム • TextFieldParser ⇒ CsvHelper移行 外部システム② 障害 • デフォルトの挙動に差異があることに気が付かなかった • TextFieldParser :Trim有効 • CsvHelper :Trim無効 • 外部システムからの連携CSVの取込結果に差異が発生 • 幸い業務影響はなかった Copyright 2022 @nuits_jp Slide 13

14.

え?つまらん? Copyright 2022 @nuits_jp Slide 14

15.

Agenda 1. プロダクト概要 2. プロジェクト概要 3. 顧客をどう説得したか 4. テスト戦略 5. 炎上 Copyright 2022 @nuits_jp Slide 15

16.

本当の炎上を見せてあげますよ Copyright 2022 @nuits_jp Slide 16

17.

大炎上 • Windows Server 2008R2延長サポート終了:2022年7月12日 2021年 2022年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 4月 5月 6月 7月 ★プロジェクト開始 バッファー ★リリース予定日 ★DCでサーバー構築 リミット★ Copyright 2022 @nuits_jp Slide 17

18.

大炎上 • Windows Server 2008R2延長サポート終了:2022年7月12日 2021年 2022年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 4月 5月 6月 7月 ★プロジェクト開始 バッファー ラックにケーブル が来てない! ★リリース予定日 ★DCでサーバー構築 リミット★ Copyright 2022 @nuits_jp Slide 18

19.

大炎上 • Windows Server 2008R2延長サポート終了:2022年7月12日 2021年 2022年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 4月 5月 6月 7月 ★プロジェクト開始 バッファー ラックにケーブル が来てない! ★リリース予定日 ★DCでサーバー構築 リリース予定日 ★DCでサーバー構築 半導体不足でどうし ても3カ月かかる ★ 3カ月×10人の原価増 はわわ・・・ リミット★ Copyright 2022 @nuits_jp Slide 19

20.

光ケーブルは半導体 Copyright 2022 @nuits_jp Slide 20

21.

.NET 6 migration of a financial company's mission-critical system. プロダクト概要 Copyright 2022 @nuits_jp

22.

Product Overview • 業種:金融 • 仮称:Image Document Workplace(以降IDW) • 概要:画像化された、手書きの書類を扱うワークプレイス • 略歴 • 2013年4月に初期バージョンの開発開始 • 当初の利用者数200人 • 以後継続的に、年50~100人月程度開発 • 徐々に適用業務も広がった • 2020年12月に基幹システムに昇格 • 全国の営業店で受け取った書類はその場で画像化されIDW上へ Copyright 2022 @nuits_jp Slide 22

23.

Product Overview(Before) 顧客環境 Client DB Server AP Server ・ ・ ・ WPF Console App Windows Service .NET Framework 4.5.2 Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 23

24.

Product Overview(Before) 顧客環境 Client DB Server AP Server ・ ・ ・ WPF Console App Windows Service .NET Framework 4.5.2 Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 24

25.

Product Overview(Before) 顧客環境 Client DB Server AP Server ・ ・ ・ WPF Console App Windows Service .NET Framework 4.5.2 Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 25

26.

Product Overview(Before) 顧客環境 Client DB Server AP Server ・ ・ ・ WPF Console App Windows Service .NET Framework 4.5.2 Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 26

27.

Product Overview(Before) 顧客環境 Client DB Server AP Server ・ ・ ・ WPF Console App Windows Service .NET Framework 4.5.2 Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 27

28.

Product Overview(Before) 顧客環境 Client DB Server AP Server ・ ・ ・ WPF Console App Windows Service .NET Framework 4.5.2 Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 28

29.

.NET 6 migration of a financial company's mission-critical system. プロジェクト概要 Copyright 2022 @nuits_jp Slide 29

30.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 6. クラウド移行 Copyright 2022 @nuits_jp Slide 30

31.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. マイナンバーを扱うシステムでコンプラ問題が 非機能要件を見直し、見合った性能を確保する 解決できる確証がなかったこと 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 6. クラウド移行 Copyright 2022 @nuits_jp Slide 31

32.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 2020年の基幹システムリリース時に、「ガチ炎上」した 生産性向上のため機能追加・改修(性能改善含む)の実施 そのため顧客を含めたチーム全体にとって悲願 6. クラウド移行 Copyright 2022 @nuits_jp Slide 32

33.

Project Schedule Client DB Server AP Server ・ ・ ・ フェーズ 1 2 3 4 2021年 5 6 7 8 9 10 11 12 1 2022年 2 3 4 5 6 7 8 9 10 11 12 サーバー移行 機能追加・改修 Copyright 2022 @nuits_jp Slide 33

34.

Project Schedule Client DB Server サーバー移行フェーズではOS・ミ ドルウェア・Runtimeの変更 AP Server ・ ・ ・ 接続の向きを変えるだけ フェーズ 1 2 3 4 Phase1:サーバー移行 2021年 5 6 7 8 9 10 11 12 1 2022年 2 3 4 5 6 7 8 9 10 11 12 サーバー移行 機能追加・改修 Copyright 2022 @nuits_jp Slide 34

35.

Project Schedule Client DB Server AP Server ・ ・ ・ Phase1:サーバー移行 Phase2:機能追加・改修 フェーズ 1 2 3 4 2021年 5 6 7 8 9 10 11 12 1 2022年 2 3 4 5 6 7 8 9 10 11 12 サーバー移行 機能追加・改修 Copyright 2022 @nuits_jp Slide 35

36.

で、.NETなに使おう? Copyright 2022 @nuits_jp Slide 36

37.

.NETどうする? 顧客環境 Client DB Server AP Server ・ ・ ・ ここは仕方ない WPF Console App Windows Service .NET Framework 4.7.2 ? Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 37

38.

.NETどうする? 顧客環境 Client DB Server AP Server ・ ・ ・ 何にすべきか? ここは仕方ない WPF Console App Windows Service .NET Framework 4.7.2 ? Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 38

39.

悩ましいスケジュール 項目 1 2 3 4 5 2021年 6 7 8 9 10 11 12 2022年 1 2 3 .NET 6 Release 物理移行フェーズ 要件定義~結合テスト システムテスト 受入テスト リリース 2つの選択肢 1. .NET Framework 4.8で永久に塩漬けする 2. .NET 6で2年おきにリプレースし続ける Copyright 2022 @nuits_jp ここまでの流れから 4.8じゃないの? Slide 39

40.

.NETと一緒にキャリアの塩付けはいやだ! Copyright 2022 @nuits_jp Slide 40

41.

最新.NETを適用していくメリット 1. 最新.NET自体の強み 1. 性能向上 2. 品質向上(nullableとか) 3. 生産性向上(便利機能は今後.NET向けに) 2. 将来的なクラウド利用に対する布石 3. エンジニアのモチベーションの向上 1. 生産性向上 2. 品質向上 Copyright 2022 @nuits_jp Slide 41

42.

最新.NETを適用していくメリット 1. 最新.NET自体の強み 1. 性能向上 2. 生産性向上 3. 品質向上 2. 将来的なクラウド利用に対する布石 3. エンジニアのモチベーションの向上 1. 生産性向上 「幸福感の高い社員の創造性は3倍、生産性は31%、売上は37%高い上に、欠勤率が 41%、離職率が59%低く、業務上の事故が70%少ない」 2. 品質向上 慶應義塾大学大学院 - 前野隆司教授 https://www.lifehacker.jp/article/245162great_place_to_work Copyright 2022 @nuits_jp Slide 42

43.

弊社「働き方変革」 https://kagayakutelework.jp/seminar/2020/pdf/tokyo04/ricoh201223.pdf Copyright 2022 @nuits_jp Slide 43

44.

弊社「働き方変革」 https://kagayakutelework.jp/seminar/2020/pdf/tokyo04/ricoh201223.pdf Copyright 2022 @nuits_jp Slide 44

45.

弊社「働き方変革」 「自己正当化ストーリー」 https://kagayakutelework.jp/seminar/2020/pdf/tokyo04/ricoh201223.pdf Copyright 2022 @nuits_jp Slide 45

46.

エンジニアの悪癖 Copyright 2022 @nuits_jp Slide 46

47.

これでは顧客を説得できない Copyright 2022 @nuits_jp Slide 47

48.

.NET 6 migration of a financial company's mission-critical system. 顧客をどう説得したか Copyright 2022 @nuits_jp

49.

顧客の視点から考えてみる Copyright 2022 @nuits_jp Slide 49

50.

顧客から見た.NET6 Copyright 2022 @nuits_jp Slide 50

51.

顧客から見た.NET6 技術的リスク Copyright 2022 @nuits_jp Slide 51

52.

顧客から見た.NET6 コスト 技術的リスク Copyright 2022 @nuits_jp Slide 52

53.

コスト 顧客から見た.NET6 技術的リスク ??? Copyright 2022 @nuits_jp Slide 53

54.

顧客から見た.NET6 コスト 同程度のウェイトか? 技術的リスク Copyright 2022 @nuits_jp Slide 54

55.

顧客から見た.NET6 コスト 圧倒的に解消しやすい 技術的リスク Copyright 2022 @nuits_jp Slide 55

56.

前提として Copyright 2022 @nuits_jp Slide 56

57.

前提 • 今回.NET 6にアップデート することは、大きなリスクはない 1. .NET Frameworkに依存する機能は「ほぼ」無い 2. 十分な体制 3. 十分な時間 4. 十分なコスト • 2年おきに更新しつづけることがリスク Copyright 2022 @nuits_jp Slide 57

58.

そのうえで・・・ Copyright 2022 @nuits_jp Slide 58

59.

技術的リスクが低いと考える理由 1. .NET Frameworkから.NETへの移行は破壊的変更が多い 2. .NET 6から.NET 8への移行は基本的に後方互換性を期待できる 3. リスクの大きさ net4.5.2⇒net6.0 >>>超えられない壁>>> net6.0⇒net8.0 4. つぎの2つが用意できれば、今後のリスクは非常に小さい 1. 再現性あるテスト⇒自動テスト 2. 十分な品質のテスト Copyright 2022 @nuits_jp Slide 59

60.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 60

61.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 ※ テストの詳細は後半で Copyright 2022 @nuits_jp Slide 61

62.

顧客から見た.NET6 技術的リスク Copyright 2022 @nuits_jp Slide 62

63.

顧客から見た.NET6 技術的リスク テスト品質の改善 Copyright 2022 @nuits_jp Slide 63

64.

顧客から見た.NET6 テスト品質の改善 コスト 技術的リスク Copyright 2022 @nuits_jp Slide 64

65.

何をもって倒す? Copyright 2022 @nuits_jp Slide 65

66.

顧客から見た.NET6 性能向上 品質向上 生産性向上 テスト品質の改善 コスト 技術的リスク Copyright 2022 @nuits_jp Slide 66

67.

顧客から見た.NET6 クラウド適正 性能向上 品質向上 生産性向上 テスト品質の改善 コスト 技術的リスク Copyright 2022 @nuits_jp Slide 67

68.

右に傾いたりしない Copyright 2022 @nuits_jp Slide 68

69.

顧客から見た.NET6 クラウド適正 性能向上 コスト 同じ尺度で定量的に比較が難しく 推測であって事実にならない ⇩ この状態では「やらない」になる 品質向上 生産性向上 テスト品質の改善 技術的リスク Copyright 2022 @nuits_jp Slide 69

70.

顧客から見た.NET6 テスト品質の改善 コスト 技術的リスク Copyright 2022 @nuits_jp Slide 70

71.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 71

72.

メンバー育成がひとつのGoalとなった理由 メンバー 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 わたし 社員A 社員B 社員C 社員D 社員E パートナーA パートナーB 徐々に品質が維持できなくなり・・・ パートナーC ・・・ パートナーZ この辺りから初期を 知る人がいなくなる Copyright 2022 @nuits_jp Slide 72

73.

炎上の要因 • 開発サイドと顧客サイドの双方に問題があった • 開発サイドの問題 • 未改修の機能が停止した • 改修箇所に依存する機能への影響想定が不十分だった • そもそも想定可能なメンバーが私一人しかいなかった 業務・システムともに習熟したメンバーの育成 Copyright 2022 @nuits_jp Slide 73

74.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 74

75.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 一度育成して終わりではない 育成後は維持する必要がある Copyright 2022 @nuits_jp Slide 75

76.

定期的なアップデートで維持できないか? Copyright 2022 @nuits_jp Slide 76

77.

コストの解消とメンバー育成 • およそ2年~3年でメンバーが入れ替わる • 2年おきに継続的にメンバーを再教育する • もっとも最適な教育はなにか? • ビジネス シナリオ テストの実施 • .NET のライフサイクルは3年 • LTSのリリース間隔は2年 • 同時に.NETをアップデートすることで実質ノーコストでテスト可能 Copyright 2022 @nuits_jp Slide 77

78.

顧客から見た.NET6 テスト品質の改善 コスト 技術的リスク Copyright 2022 @nuits_jp Slide 78

79.

顧客から見た.NET6 コスト メンバー再教育コスト 技術的リスク テスト品質の改善 Copyright 2022 @nuits_jp Slide 79

80.

顧客から見た.NET6 コスト メンバー再教育コスト 対比して比較できる構造になっている 技術的リスク テスト品質の改善 Copyright 2022 @nuits_jp Slide 80

81.

あとはシンプルです Copyright 2022 @nuits_jp Slide 81

82.

顧客から見た.NET6 コスト メンバー再教育コスト 技術的リスク テスト品質の改善 Copyright 2022 @nuits_jp Slide 82

83.

顧客から見た.NET6 クラウド適正 性能向上 品質向上 生産性向上 コスト 技術的リスク メンバー再教育コスト テスト品質の改善 Copyright 2022 @nuits_jp Slide 83

84.

顧客から見た.NET6 クラウド適正 性能向上 品質向上 生産性向上 コスト • 価値があることは理解している • 釣り合っていれば十分傾く 技術的リスク メンバー再教育コスト テスト品質の改善 Copyright 2022 @nuits_jp Slide 84

85.

こうして.NET 6移行の理解を得ました Copyright 2022 @nuits_jp Slide 85

86.

ところで話が上手すぎると思った人? Copyright 2022 @nuits_jp Slide 86

87.

スタートは実はここ コスト 釣り合う要素は? 技術的リスク Copyright 2022 @nuits_jp Slide 87

88.

釣り合う要素を逆算し・・・ コスト メンバー再教育コスト 技術的リスク テスト品質の改善 Copyright 2022 @nuits_jp Slide 88

89.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 89

90.

当初の顧客要求は少し異なった Copyright 2022 @nuits_jp Slide 90

91.

当初の顧客要求 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 91

92.

保守・運用側の課題 1. ・・・ 2. 業務とシステムの全体を把握している人材が不足している 3. ・・・ 4. ・・・ Copyright 2022 @nuits_jp Slide 92

93.

マージして・・・ Copyright 2022 @nuits_jp Slide 93

94.

逆提案した 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 94

95.

逆提案した 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する これらの具体的な施策もすべて提案に含めました 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 95

96.

逆提案した 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. これらの具体的な施策もすべて提案に含めました 生産性向上のため機能追加・改修(性能改善含む)の実施 あえて伝えなかったのは・・・ Copyright 2022 @nuits_jp Slide 96

97.

私が.NET 6にしたくて仕方なかったことだけ Copyright 2022 @nuits_jp Slide 97

98.

Thank You! おしまい! Copyright 2022 @nuits_jp Slide 98

99.

だと技術的な話が、ほぼ無くてさみしいので・・・ Copyright 2022 @nuits_jp Slide 99

100.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 テスト品質の改善について 今回練り直した・・・ Copyright 2022 @nuits_jp Slide 100

101.

.NET 6 migration of a financial company's mission-critical system. テスト戦略 Copyright 2022 @nuits_jp

102.

ドキュメント・テスト体系 Copyright 2022 @nuits_jp Slide 102

103.

設計とテスト 業務 1 業務シナリオ n 1 1 業務テスト n n 機能 1 機能シナリオ n 1 1 機能テスト 実装など Copyright 2022 @nuits_jp Slide 103

104.

設計とテスト 業務 1 業務シナリオ n 1 1 業務テスト n n 機能 1 機能シナリオ n 1 1 機能テスト 実装など Copyright 2022 @nuits_jp Slide 104

105.

設計とテスト 業務 1 業務シナリオ n 1 1 業務テスト n n 機能 1 機能シナリオ n 1 1 機能テスト 実装など Copyright 2022 @nuits_jp Slide 105

106.

Project Goal 1. OSのESU期限となる2022年7月までに新環境へ移行する 2. 移行に際し、業務に影響を与えず移行をする 3. 基幹システムに見合った、安定した開発/運用の実現 a. テスト品質の改善 b. 業務・システムともに習熟したメンバーの育成 4. 非機能要件を見直し、見合った性能を確保する 5. 生産性向上のため機能追加・改修(性能改善含む)の実施 Copyright 2022 @nuits_jp Slide 106

107.

設計とテスト 業務 1 業務シナリオ n 1 1 業務テスト n n 機能 1 機能シナリオ n 1 1 機能テスト 実装など Copyright 2022 @nuits_jp Slide 107

108.

設計とテスト 業務テスト 機能テスト Copyright 2022 @nuits_jp Slide 108

109.

設計とテスト 業務・システムともに習熟したメンバーの育成 テスト品質の改善 業務テスト 機能テスト Copyright 2022 @nuits_jp Slide 109

110.

設計とテスト 業務・システムともに習熟したメンバーの育成 業務テスト 機能テスト Copyright 2022 @nuits_jp Slide 110

111.

設計とテスト 業務・システムともに習熟したメンバーの育成 テスト品質の改善 業務テスト 機能テスト Copyright 2022 @nuits_jp Slide 111

112.

設計とテスト 業務・システムともに習熟したメンバーの育成 テスト品質の改善 業務テスト 機能テスト .NETバージョンアップの主役 Copyright 2022 @nuits_jp Slide 112

113.

機能テストの状態 1. 概ね十分なテストケース 2. 再現性が担保されたテストデータ 3. テストの実施は手動 4. 期待結果との比較は目視 これらの自動化がゴール Copyright 2022 @nuits_jp Slide 113

114.

機能テスト戦略 1. .NET Frameworkバージョンで手動テスト実施 2. Databaseの全テーブルをダンプして期待値を作成 3. Microsoft公式のガイドに従って.NETへ移行 • .NET Framework から .NET への移植の概要 https://docs.microsoft.com/ja-jp/dotnet/core/porting/ 4. テストの自動化 5. 実行結果をダンプしてNo.2の期待値と比較 上記はDatabaseに限定して説明しています Copyright 2022 @nuits_jp Slide 114

115.

バグも含めて現行動作を担保 10年動いているシステムのバグは、業務的にはとっくに仕様 Copyright 2022 @nuits_jp Slide 115

116.

Project Schedule Client DB Server AP Server ・ ・ ・ Phase1:サーバー移行 Phase2:機能追加・改修 フェーズ 1 2 3 4 2021年 5 6 7 8 9 10 11 12 1 2022年 2 3 4 5 6 7 8 9 10 11 12 サーバー移行 機能追加・改修 Copyright 2022 @nuits_jp Slide 116

117.

機能テスト戦略 1. .NET Frameworkバージョンで手動テスト実施 2. Databaseの全テーブルをダンプして期待値を作成 3. Microsoft公式のガイドに従って.NETへ移行 • .NET Framework から .NET への移植の概要 https://docs.microsoft.com/ja-jp/dotnet/core/porting/ 4. .NET 6でテストの自動化 5. 実行結果をダンプしてNo.2の期待値と比較 Copyright 2022 @nuits_jp Slide 117

118.

機能テスト戦略 1. .NET Frameworkバージョンで手動テスト実施 2. Databaseの全テーブルをダンプして期待値を作成 3. Microsoft公式のガイドに従って.NETへ移行 • .NET Framework から .NET への移植の概要 https://docs.microsoft.com/ja-jp/dotnet/core/porting/ 4. .NET 6でテストの自動化 5. 実行結果をダンプしてNo.2の期待値と比較 Copyright 2022 @nuits_jp Slide 118

119.

めんどくさい。たとえば時間の扱いとか Copyright 2022 @nuits_jp Slide 119

120.

時間のパターン No. 期待値のパターン 1 固定値 2 3 説明 おもにテスト開始前に登録され、意図せず変更されないことを評価する。 Copyright 2022 @nuits_jp Slide 120

121.

時間のパターン No. 期待値のパターン 説明 1 固定値 おもにテスト対象外のデータ。意図せず変更されないことを評価する。 2 可変 – DB初期化時刻以前 テスト開始前で、5分以内の時刻が必要といったケース 3 Copyright 2022 @nuits_jp Slide 121

122.

時間のパターン No. 期待値のパターン 説明 1 固定値 おもにテスト対象外のデータ。意図せず変更されないことを評価する。 2 可変 – DB初期化時刻以前 たとえば、前回の実行から、所定の時間を経過していなかった場合、処理 をパスするような振る舞い 3 可変 - DB初期化時刻以後 UpdateAtのような列 Copyright 2022 @nuits_jp Slide 122

123.

テストが難しくなる要素 1. 時間 2. 環境(例えばログのホスト名) 3. 冪等性の担保されていないサービス・ライブラリへの依存 3は、そっちを直せよって気分になりますが、例えば・・・ 個別に対応する内容じゃない 「PDFのメタデータには作成日時や更新日時が含まれている 同じ条件でPDFを生成しても、同じバイナリーにならない」 Copyright 2022 @nuits_jp Slide 123

124.

ツール&ライブラリー作りました Copyright 2022 @nuits_jp Slide 124

125.

DbAssertions 提供機能 1. DatabaseからCSVでエクスポートして期待値を作成するツール 2. テスト実行後にDatabaseとCSVを比較するライブラリ https://github.com/nuitsjp/DbAssertions Copyright 2022 @nuits_jp Slide 125

126.

リポジトリをのぞいてみると・・・ No. 1 2 3 4 5 ディレクトリ 説明 DbAssertions DbAssertions.SqlServer DbAssertions.SqlServer.App DbAssertions.Test Sample Copyright 2022 @nuits_jp Slide 126

127.

リポジトリをのぞいてみると・・・ No. 1 2 3 4 5 ディレクトリ 説明 DbAssertions コアライブラリ。一応DB非依存で、No.2・3から依存されている。 DbAssertions.SqlServer DbAssertions.SqlServer.App DbAssertions.Test Sample Copyright 2022 @nuits_jp Slide 127

128.

リポジトリをのぞいてみると・・・ No. ディレクトリ 1 DbAssertions 2 DbAssertions.SqlServer 説明 コアライブラリ。一応DB非依存で、No.2・3から依存されている。 DbAssertionsのSQL Server向けの実装 • DBの値をエクスポートして期待値ファイルの作成 • ユニットテストへ期待値との比較するAssertionの提供 Appおよびテストコードから利用される 3 DbAssertions.SqlServer.App 4 DbAssertions.Test 5 Sample Copyright 2022 @nuits_jp Slide 128

129.

リポジトリをのぞいてみると・・・ No. ディレクトリ 1 DbAssertions 2 DbAssertions.SqlServer 説明 コアライブラリ。一応DB非依存で、No.2・3から依存されている。 DbAssertionsのSQL Server向けの実装 • DBの値をエクスポートして期待値ファイルの作成 • ユニットテストへ期待値との比較処理の提供 Appおよびテストコードから利用される 3 DbAssertions.SqlServer.App 期待値ファイルを作成するため、No.2をコンソールアプリケーション として提供する 4 DbAssertions.Test 5 Sample Copyright 2022 @nuits_jp Slide 129

130.

リポジトリをのぞいてみると・・・ No. ディレクトリ 1 DbAssertions 2 DbAssertions.SqlServer 説明 コアライブラリ。一応DB非依存で、No.2・3から依存されている。 DbAssertionsのSQL Server向けの実装 • DBの値をエクスポートして期待値ファイルの作成 • ユニットテストへ期待値との比較処理の提供 Appおよびテストコードから利用される 3 DbAssertions.SqlServer.App SQL Server用の期待値ファイルを作成するためのアプリケーション 4 DbAssertions.Test No.1・2のテストコード 5 Sample Copyright 2022 @nuits_jp Slide 130

131.

リポジトリをのぞいてみると・・・ No. ディレクトリ 1 DbAssertions 2 DbAssertions.SqlServer 説明 コアライブラリ。一応DB非依存で、No.2・3から依存されている。 DbAssertionsのSQL Server向けの実装 • DBの値をエクスポートして期待値ファイルの作成 • ユニットテストへ期待値との比較処理の提供 Appおよびテストコードから利用される 3 DbAssertions.SqlServer.App SQL Server用の期待値ファイルを作成するためのアプリケーション 4 DbAssertions.Test No.1・2のテストコード 5 Sample デモで利用するサンプルリソース置き場 Copyright 2022 @nuits_jp Slide 131

132.

もうコード見てたって人、手を挙げて! Copyright 2022 @nuits_jp Slide 132

133.

お題 1. AdventureWorks - いつもいつもお世話になります 2. PersonスキーマのPersonテーブルを利用 3. 初期化時にID=1の行を更新 1. ModifiedDateを現在時刻に 4. テストでは、ID=2の行を更新 1. TITLEを「Mr.」に 2. ModifiedDateを現在時刻に 先ほどのリポジトリのSampleプロジェクトを参照 • https://github.com/nuitsjp/DbAssertions Copyright 2022 @nuits_jp Slide 133

134.

テスト自動化の手順 1. AdventureWorksをきれいな状態で起動する 2. テスト前の状態にデータを更新する(Initialize.sql) 3. 自動化対象を実行する(UpdateTitle.sql) 2回実行する 4. ツール(DbAssertions.SqlServer.App.exe)でDBをダンプする 5. テストを自動化する(Sample.csproj) Copyright 2022 @nuits_jp Slide 134

135.

実際に見てみよう! Copyright 2022 @nuits_jp Slide 135

136.

.NETどうする? 顧客環境 Client WPF DB Server AP Server 48プログラムを自動化 ・ ・ ・ Console App Windows Service .NET Framework 4.7.2 .NET 6 Windows 10 Windows Server 2008 R2 Copyright 2022 @nuits_jp Slide 136

137.

使いたい人は、ドキュメント書けってIssue建ててplz. Copyright 2022 @nuits_jp Slide 137

138.

.NET 6 migration of a financial company's mission-critical system. まとめ Copyright 2022 @nuits_jp

139.

まとめ プロジェクトスポンサーから見た場合、.NET Frameworkが選びやすい のは事実だと思います。 今回は私が顧客を説得できたシナリオを紹介しましたが、背景に強く依 存した内容です。 これをそのまま流用するというわけにはいかないでしょう。 技術者として、よりモダンな環境に身を置けるようにするため Copyright 2022 @nuits_jp Slide 139

140.

皆さん自身のwin-winのシナリオを見つけよう! Copyright 2022 @nuits_jp Slide 140

141.

Thank You! おしまい! Copyright 2022 @nuits_jp Slide 141