解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(
解剖 SQLSERVER 第六篇 对OrcaMDF的 系统 测试 里 避免 regressions(译) http://improve.dk/avoiding-regressions-in-orcamdf-by-system-testing/ 当我继续添加新功能和新的数据结构支持进去OrcaMDF软件的时候,bug的风险不断增加 特别是当我开发一个很大
解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions (译)
http://improve.dk/avoiding-regressions-in-orcamdf-by-system-testing/
当我继续添加新功能和新的数据结构支持进去OrcaMDF软件的时候,bug的风险不断增加
特别是当我开发一个很大的未知功能时,我不能预估结构和该结构的关联,为了降低风险,测试是很有必要的
单元测试
单元测试是在面向对象编程里测试源代码某一个功能的最小一部分的测试。一个测试的例子是SqlBigInt数据类型解析类,
他应该长这个样子
<span>using</span><span> System; </span><span>using</span><span> NUnit.Framework; </span><span>using</span><span> OrcaMDF.Core.Engine.SqlTypes; </span><span>namespace</span><span> OrcaMDF.Core.Tests.Engine.SqlTypes { [TestFixture] </span><span>public</span> <span>class</span><span> SqlBigIntTests { [Test] </span><span>public</span> <span>void</span><span> GetValue() { </span><span>var</span> type = <span>new</span><span> SqlBigInt(); </span><span>byte</span><span>[] input; input </span>= <span>new</span> <span>byte</span>[] { <span>0xFF</span>, <span>0xFF</span>, <span>0xFF</span>, <span>0xFF</span>, <span>0xFF</span>, <span>0xFF</span>, <span>0xFF</span>, <span>0x7F</span><span> }; Assert.AreEqual(</span><span>9223372036854775807</span><span>, Convert.ToInt64(type.GetValue(input))); input </span>= <span>new</span> <span>byte</span>[] { <span>0x82</span>, <span>0x5A</span>, <span>0x03</span>, <span>0x1B</span>, <span>0xD5</span>, <span>0x3E</span>, <span>0xCD</span>, <span>0x71</span><span> }; Assert.AreEqual(</span><span>8200279581513702018</span><span>, Convert.ToInt64(type.GetValue(input))); input </span>= <span>new</span> <span>byte</span>[] { <span>0x7F</span>, <span>0xA5</span>, <span>0xFC</span>, <span>0xE4</span>, <span>0x2A</span>, <span>0xC1</span>, <span>0x32</span>, <span>0x8E</span><span> }; Assert.AreEqual(</span>-<span>8200279581513702017</span><span>, Convert.ToInt64(type.GetValue(input))); } [Test] </span><span>public</span> <span>void</span><span> Length() { </span><span>var</span> type = <span>new</span><span> SqlBigInt(); Assert.Throws</span><argumentexception>(() => type.GetValue(<span>new</span> <span>byte</span>[<span>9</span><span>])); Assert.Throws</span><argumentexception>(() => type.GetValue(<span>new</span> <span>byte</span>[<span>7</span><span>])); } } }</span></argumentexception></argumentexception>
这个测试包含了SqlBigInt 类的主入口点,测试long bigint 数据类型是否会造成上溢或下溢的情况,也包含长度检查。
对于像SqlBigInt这样简单的类型单元测试会工作得很好。有时候单元测试会很复杂当相关联的类需要调用相应方法,类等支持他运行的底层结构的时候(mock测试)
虽然这是一个工作策略,测试需要不断进行,特别在项目早期阶段,整个架构都是动态的
系统测试
在测试范围上,我们需要更大的范围测试 -系统测试。系统测试旨在测试系统作为一个整体,基本上忽略系统内部工作原理
如果要分类的话可以被分为 黑盒测试。对于OrcaMDF,我估计可以捕获90%的所有的regressions 只使用10%的时间,
相比起单元测试使用更多时间只捕获少量的regressions 。
因此,这是一个很好的方法在开发期间的测试,同时可以引入关键的单元测试和集成测试。
例如我想测试DatabaseMetaData 类里面的用户表名字的解析,我可以模拟SysObjects的值列表,同时对于DatabaseMetaData 类
的构造函数也能模拟MdfFile 所必须的参数,为了做到这一点,我必须从MdfFile 提取出一个接口并且在上面使用mocking framework
系统测试的方法执行以下流程:
1、连接到SQLSERVER实例
2、在测试固件(Test fixture)里创建测试架构
3、分离数据库
4、运行OrcaMDF 并加载分离的数据库验证结果
一个测试样例,创建两个用户表并且验证DatabaseMetaData类的输出
<span>using</span><span> System.Data.SqlClient; </span><span>using</span><span> NUnit.Framework; </span><span>using</span><span> OrcaMDF.Core.Engine; </span><span>namespace</span><span> OrcaMDF.Core.Tests.Integration { </span><span>public</span> <span>class</span><span> ParseUserTableNames : SqlServerSystemTest { [Test] </span><span>public</span> <span>void</span><span> ParseTableNames() { </span><span>using</span>(<span>var</span> mdf = <span>new</span><span> MdfFile(MdfPath)) { </span><span>var</span> metaData =<span> mdf.GetMetaData(); Assert.AreEqual(</span><span>2</span><span>, metaData.UserTableNames.Length); Assert.AreEqual(</span><span>"</span><span>MyTable</span><span>"</span>, metaData.UserTableNames[<span>0</span><span>]); Assert.AreEqual(</span><span>"</span><span>XYZ</span><span>"</span>, metaData.UserTableNames[<span>1</span><span>]); } } </span><span>protected</span> <span>override</span> <span>void</span><span> RunSetupQueries(SqlConnection conn) { </span><span>var</span> cmd = <span>new</span> SqlCommand(<span>@"</span><span> CREATE TABLE MyTable (ID int); CREATE TABLE XYZ (ID int);</span><span>"</span><span>, conn); cmd.ExecuteNonQuery(); } } }</span>
在实际的真实生活场景里这样可以非常快速的进行测试。想测试转发记录的解析?只需要简单地创建一个新的测试
编写TSQL代码来生成目标数据库状态然后验证扫描到的表数据
系统测试的缺点
不幸的是系统测试不是万能药,它也有它的缺点。最明显的一个缺点是性能。
单元测试通常需要运行非常快,基本上允许您在每个文件保存后在后台运行它们。从绑定CPU开始到运行 ,每一个这样的系统测试都需要半秒
幸运的是,它们可以并行运行没有问题。在一台四核的机器能让我每分钟运行480个测试。这能够让一个完整的测试集合控制在合理的时间,
同时依然保持测试子集能够很快运行。通常代码的更改不会对测试造成太多的影响
第六篇完

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









インポート手順は次のとおりです。 MDF ファイルを SQL Server のデータ ディレクトリ (通常は C:\Program Files\Microsoft SQL Server\MSSQL\DATA) にコピーします。 SQL Server Management Studio (SSMS) でデータベースを開き、[アタッチ] を選択します。 「追加」ボタンをクリックして、MDF ファイルを選択します。データベース名を確認し、「OK」ボタンをクリックします。

SQL Server データベースに既に存在する同じ名前のオブジェクトについては、次の手順を実行する必要があります。 オブジェクトの種類 (テーブル、ビュー、ストアド プロシージャ) を確認します。 IF NOT EXISTS を使用すると、オブジェクトが空の場合に作成をスキップできます。オブジェクトにデータがある場合は、別の名前を使用するか、構造を変更してください。既存のオブジェクトを削除するには、DROP を使用します (注意してください。バックアップを推奨します)。スキーマの変更をチェックして、削除または名前変更されたオブジェクトへの参照がないことを確認します。

SQL Server サービスの開始に失敗した場合の解決手順は次のとおりです。 エラー ログを確認して、根本原因を特定します。サービス アカウントにサービスを開始する権限があることを確認してください。依存関係サービスが実行されているかどうかを確認します。ウイルス対策ソフトウェアを無効にします。 SQL Server のインストールを修復します。修復が機能しない場合は、SQL Server を再インストールします。

7月29日、AITO Wenjieの40万台目の新車のロールオフ式典に、ファーウェイの常務取締役、ターミナルBG会長、スマートカーソリューションBU会長のYu Chengdong氏が出席し、スピーチを行い、Wenjieシリーズモデルの発売を発表した。 8月にHuawei Qiankun ADS 3.0バージョンが発売され、8月から9月にかけて順次アップグレードが行われる予定です。 8月6日に発売されるXiangjie S9には、ファーウェイのADS3.0インテリジェント運転システムが初搭載される。 LiDARの支援により、Huawei Qiankun ADS3.0バージョンはインテリジェント運転機能を大幅に向上させ、エンドツーエンドの統合機能を備え、GOD(一般障害物識別)/PDP(予測)の新しいエンドツーエンドアーキテクチャを採用します。意思決定と制御)、駐車スペースから駐車スペースまでのスマート運転のNCA機能の提供、CAS3.0のアップグレード

SQL Server のポート番号を表示するには: SSMS を開いてサーバーに接続します。オブジェクト エクスプローラーでサーバー名を見つけ、右クリックして [プロパティ] を選択します。 「接続」タブで、「TCP ポート」フィールドを表示します。

SQL Server データベースを誤って削除した場合は、次の手順を実行して回復できます: データベース アクティビティの停止、ログ ファイルのバックアップ、データベース ログの確認、回復オプション: バックアップからの復元、トランザクション ログからの復元、DBCC CHECKDB の使用、3 番目の使用パーティーツール。データ損失を防ぐために、データベースを定期的にバックアップし、トランザクション ログを有効にしてください。

SQL Server のインストールが失敗した場合は、次の手順に従ってクリーンアップできます。 SQL Server をアンインストールする レジストリ キーを削除する ファイルとフォルダーを削除する コンピューターを再起動する

次の手順に従って、SQL Server の英語インストールを中国語に変更できます: 対応する言語パックをダウンロードする、SQL Server サービスを停止する、言語パックをインストールする、インスタンス言語を変更する、ユーザー インターフェイス言語を変更する、アプリケーションを再起動する。
