ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

3
匿名の名前空間はコードをテスト不能にします
典型的なC ++コードは次のとおりです。 foo.hpp #pragma once class Foo { public: void f(); void g(); ... }; foo.cpp #include "foo.hpp" namespace { const int kUpperX = 111; const int kAlternativeX = 222; bool match(int x) { return x < kUpperX || x == kAlternativeX; } } // namespace void Foo::f() { ... …
13 c++  unit-testing 

3
Given When Then(GWT)とArrange Act Assert(AAA)の違いは?
TDDには、アレンジアサート(AAA)構文があります。 [Test] public void Test_ReturnItemForRefund_ReturnsStockOfBlackSweatersAsTwo_WhenOneInStockAndOneIsReturned() { //Arrange ShopStock shopStock = new ShopStock(); Item blackSweater = new Item("ID: 25"); shopStock.AddStock(blackSweater); int expectedResult = 2; Item blackSweaterToReturn = new Item("ID: 25"); //Act shopStock.ReturnItemForRefund(blackSweaterToReturn); int actualResult = shopStock.GetStock("ID: 25"); //Assert Assert.AreEqual(expectedResult, actualResult); } BDDの記述テストでは、同様の構造を使用しますが、Given When Then(GWT)構文を使用します。 [Given(@"a customer previously bought a black sweater …
13 c#  unit-testing  tdd  bdd 

4
cに構造体をパックする標準的な方法または標準的な代替手段はありますか?
CIでのプログラミングでは、GCC __attribute__((__packed__))属性を使用して構造体をパックすることが非常に重要であることがわかったので、揮発性メモリの構造化されたチャンクをバイトの配列に簡単に変換して、バスを介して送信したり、ストレージに保存したり、レジスタのブロックに適用したりできます。パックされた構造体は、バイトの配列として扱われる場合、パディングを含まないことを保証します。これは無駄であり、セキュリティリスクの可能性があり、ハードウェアとのインターフェースの場合に互換性がありません。 すべてのCコンパイラで動作する構造体をパックするための標準はありませんか?そうでない場合、私はこれがシステムプログラミングにとって重要な機能であると考える際に外れ値ですか?C言語の初期のユーザーは、構造体をパックする必要性を見つけられなかったか、何らかの代替手段がありましたか?

1
HTMLタグの属性を順序付ける標準化されたプラクティスはありますか?
私はAngularJSプロジェクトに取り組んでおり、属性は私のHTML要素の多くで多数あります: <button type="submit" ng-click="Page.UI.DetailView.ExecuteFunction()" ng-disabled="step5.$invalid" class="btn btn-success pull-right"> Submit this Product </button> これらの属性の順序に標準化された規則はありますか?アルファベット?意味によってグループ化されていますか(例:すべての角度属性を一緒に)?最初に標準のHTML属性(たとえば「タイプ」)

5
壊れた古い/レガシーユニットテスト
私は大企業で働いており、何千ものJUnitテストがある大規模なJavaアプリケーションを担当しています。私がこの役割に移行して以来、200〜300のテストが壊れています(何年も壊れている可能性があります)。テストは古くて壊れやすく、通常はライブサンドボックスデータで終わるスパゲッティの依存関係の混乱です。 私の目標はテストを100%合格することで、単体テストの失敗でビルドを中断できますが、失敗したテストに対処するまではできません。メンテナンス予算は主にサポートのためであるため、予算はほとんどありませんが、私のチームは、問題の少ないフルーツテスト(主に構成/ローカルリソースの問題)を特定して修正しました。 ベストプラクティスに関する意見はありますか?テストは価値があるとは思いませんが、テストしているものが何なのか、掘り下げなければ動作しない理由もわかりません。おそらく時間とお金がかかるでしょう。 壊れたテストのステータスを既知のもので文書化し、壊れたテストを完全に削除または無視し、優先順位の低いバグ/作業項目を入力して調査および修正する必要があると考えています。その後、100%になり、他のテストから真の価値を引き出し始めます。メンテナンス/リファクタリングの失敗があれば、それらを再び拾い上げることができます。 最善のアプローチは何でしょうか? 編集:これはこの質問とは異なる質問だと思います。なぜなら、今後書くべきテストの明確な方向性があるからです。しかし、現在の大規模なテストセットが意味を持つようになる前に対処するために、レガシーの失敗したテストを継承しました。

2
進行中のコミットが突然、まだ存在していない別のコミットに依存しているように見える場合の対処方法
私はGitに不慣れですが、Gitに慣れるために最善を尽くし、これまでのところ、私が単独で取り組んでいるプロジェクトにそれを使用しています。 私がコーディングするとき、自然に(将来を知ることができないので)いくつかのトップダウンアプローチがあり、繰り返し発生するテーマがあります。 私はいくつかの仕事をします。 自分の仕事を「コミット可能な」何かにするためには、他の仕事をする必要があることがわかります。 他の仕事は、それ自身のコミットに値する。 コミット可能なものとは、コンパイルするもの、または完全に混乱しないものを意味します。 そして、それが自分のコミットに値するものによって、私はコミットがただ一つのことをするべきだということを学んだことを言っています。 解決方法は面倒です。他の作業が別のファイルにある場合、新しいブランチを作成し、そこでコミットしてマージします。作業が同じファイルにある場合.. ugh ..ローカルコピーを作成し、ファイルをHEADの状態にリセットし、必要なコミットを行ってから、コピーから作業を復元し始めます。実際にどのように処理する必要がありますか?私はこれが道だとは思いませんよね?私はそうは思いません。なぜなら、それは皆(少なくとも未来も知らない)には幾分頻繁に出会わなければならないからです。それとも、私のワークフローに欠陥があるようです。
13 git 

1
データベース内のドメインモデルは持続可能なソリューションになりますか?
私は、Microsoftテクノロジーをベースにした中小企業のデータベース開発者として新しい仕事を始めました。私は、ベストプラクティス、設計パターン、テスト、およびプロジェクト管理に関して、学校で教えられたものからどれだけのプラクティスが逸脱しているかに早く気づきました。 私を最も悩ませているのは、メインのデータベース開発者(以下、「ジョン」と呼びます)がデータベースにモデルスキーマを保持する方法です!これを行うには、3つの「マジック」テーブルを使用します。1つはデータベーススキーマ用、1つはテーブル用、もう1つは列用です。 レコードを「テーブル」テーブルに挿入すると、実際の対応するテーブルが(データベーストリガーを介して)生成されます。「Rows」テーブルに行を挿入すると、参照されているテーブルがその行で更新されます。これらは、彼の手作りのC#プログラムによって順番に読み取られ、C#モデルを生成します。これは、フロントエンド開発者がコントローラーおよび外部向けに使用します。 これとは別に、ほとんどの開発はASP.NET MVCフレームワークに従って行われます。 このアプローチにはいくつかの欠陥があります。 ORMを維持するために彼が必要であり、そうする時間はめったにありません(ジョブのセキュリティは良いです!) 「テーブル」および「行」テーブルのトリガーに欠陥があります。テーブルの更新も、チェック制約や「高度な」機能もサポートしていません。それらを確実に改善することはできましたが、これが道筋かどうかはまだわかりません。 データベース内のプログラムロジックを維持することは、奇妙で制限されているように感じます(ただし、C#を使用してモデルを拡張することは可能です)。 彼のC#モデルジェネレーターは、3人のうちの1人(私は1人)によって手動で実行する必要があり、まだ自動化されたビルドプロセスに含まれるほど成熟していません。 Entity Frameworkのような真のテスト済み製品への段階的導入を提案した人もいますが、彼はそれを却下し、ビジネスロジックをコード層に保持することは小規模なアプリケーションとスタートアップのブートストラッププロジェクトにのみ適していると主張しました。 この投稿は、意見を述べた議論のように見えるものに向かっていますが、それは私の意図ではありません。私たちのアーキテクチャのアプローチに関する明確化が必要です。 データベースにドメインモデルを保持することは、成長中の企業にとって持続可能なソリューションになりますか?

4
複雑なAPI(たとえばAmazon S3)に依存するコードをテストする方法は?
Amazon S3にドキュメントをアップロードするメソッドのテストに苦労していますが、この質問は重要なAPI /外部の依存関係に当てはまると思います。考えられる解決策は3つしかありませんが、満足できるものはありません。 コードを実行し、実際にドキュメントをアップロードし、AWSのAPIでアップロードされたことを確認し、テストの終了時に削除します。これにより、テストが非常に遅くなり、テストを実行するたびに費用がかかり、常に同じ結果が返されません。 モックS3。私はそのオブジェクトの内部についてはまったくわからないので、これは非常に毛深いです。 MyObject.upload()が正しい引数で呼び出されることを確認し、S3オブジェクトを正しく使用していることを信頼してください。テストだけではS3 APIを正しく使用したかどうかを確実に知る方法がないため、これは気になります。 Amazonが独自のSDKをテストし、彼らがすべてを模擬する方法を確認しました。彼らは、モックを行う200行のヘルパーを持っています。私が同じことをするのが実際的だとは思わない。 これをどうやって解決しますか?
13 testing  mocking 

4
Windows用に32ビットバージョンのみを展開するか、32ビットバージョンと64ビットバージョンの両方を展開する必要がありますか?
コンパイルされた言語で書かれたクロスプラットフォームアプリケーションがあります。 Linuxでは、amd64ビルドとi386ビルドの両方をユーザーが使用できるようにするのが一般的であるため、ユーザーは現在の環境に適したバージョンを選択できます。 Macでは、Universal Binaryを作成するのが一般的であるため、Appleコンピューターの複数のバージョンをサポートできます。または、現在のすべてのAppleコンピューターは64ビットアーキテクチャとOSを使用しているため、64ビットバージョンを提供します。 「あなたはどんなアーキテクチャですか?」と尋ねてユーザーを混乱させたくはありませんが、32ビットのみをデプロイするのは悪い考えです。 私のアイデア: アプリケーションの32ビットバージョンと64ビットバージョンの両方をインストールし、実行時に選択します。(ラッパーが必要なので、クリックして起動するアプリケーション(uTorrentなど)を作成するのは困難です)。 User-agentWebサイトでアーキテクチャを検出し、ユーザーが適切なバージョンを自動的にダウンロードできるようにします(および「代替バージョン」へのリンクを作成します)。(Google Chromeスタイルです) ユーザーに32ビットアプリケーションの使用を強制し、64ビットバージョンを「エキスパート専用」にしますか?(VLCなど) Windowsで何をすべきですか?

3
Swiftの各デリゲートに個別のクラス拡張を使用する理由は何ですか?
私はレイ・ウェンダリッヒのチュートリアルを進めていましたが、作者がクラス拡張機能を使用してデリゲートコールバックを保持していることに気付きました。 クラス拡張内のコールバックを委任する: extension LogsViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } それをクラス内に含めるのではなく: クラス内のコールバックを委任する: class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 私はこれを同時に奇妙で面白いと感じました。「LogsViewControllerExtension.swift」という名前のLogsViewControllerクラスの拡張機能専用のファイルがあり、デリゲートプロトコルごとに異なる拡張機能があります:UITableViewDataSource、UISplitViewDelegateなど。 それぞれ独自のファイル内でコールバックを委任する複数のクラス拡張機能: extension LogsViewController: UISplitViewControllerDelegate { ... callbacks } extension LogsViewController : UIPopoverPresentationControllerDelegate …

3
特定の条件でプログラマーの注意を引く方法
例から始めましょう。 たとえば、exportDBスキーマに大きく依存するというメソッドがあります。また、「大きく依存する」ということは、特定のテーブルに新しい列を追加すると、頻繁に(非常に頻繁に)対応するexportメソッドが変更されることを知っています(通常、エクスポートデータにも新しいフィールドを追加する必要があります)。 プログラマーは、exportメソッドを変更することを忘れることがよくあります。これを確認する必要があるかどうかは明確ではないからです。私の目標は、プログラマーがメソッドを見るのを忘れたのか、エクスポートデータにフィールドを追加したくないだけなのかを明確に決定するようプログラマーに強制することexportです。そして、私はこの問題の設計ソリューションを探しています。 私には2つのアイデアがありますが、どちらにも欠点があります。 スマートな「すべてを読む」ラッパー すべてのデータが明示的に読み取られるようにするスマートラッパーを作成できます。 このようなもの: def export(): checker = AllReadChecker.new(table_row) name = checker.get('name') surname = checker.get('surname') checker.ignore('age') # explicitly ignore the "age" field result = [name, surname] # or whatever checker.check_now() # check all is read return result そのため、読み取られなかった別のフィールドが含まれてcheckerいるかどうかをアサートしtable_rowます。しかし、このことはすべて重そうに見え、(おそらく)パフォーマンスに影響します。 「その方法を確認する」unittest 最後のテーブルスキーマを記憶し、テーブルが変更されるたびに失敗するunittestを作成するだけです。その場合、プログラマーは「exportメソッドをチェックアウトするのを忘れないでください」のようなものを見るでしょう。警告プログラマーを非表示にするには、問題をチェックアウトしexport、手動で(別の問題です)新しいフィールドを追加してテストを修正します。 私には他にもいくつかのアイデアがありますが、それらは実装するのが面倒で、理解するのが難しすぎます(そして、プロジェクトをパズルにしたくないのです)。 上記の問題は、私が時々遭遇するより広範なクラスの問題の例です。いくつかのコードやインフラストラクチャをバインドしたいので、それらのいずれかを変更すると、すぐにプログラマに別のコードをチェックするよう警告します。通常、一般的なロジックの抽出や信頼性の高い単体テストの作成などの簡単なツールがありますが、より複雑なケースのツールを探しています。

2
forループ内のコレクションを変更するための新しいリストを作成することは設計上の欠陥ですか?
私は最近Collection was modified、C#でこの一般的な無効な操作に出くわしましたが、それを完全に理解している間、それはそのような一般的な問題のようです(グーグル、約30万件の結果!)。しかし、リストを確認しながら変更することも論理的で簡単なことのようです。 List<Book> myBooks = new List<Book>(); public void RemoveAllBooks(){ foreach(Book book in myBooks){ RemoveBook(book); } } RemoveBook(Book book){ if(myBooks.Contains(book)){ myBooks.Remove(book); if(OnBookEvent != null) OnBookEvent(this, new EventArgs("Removed")); } } 繰り返し処理するために別のリストを作成する人もいますが、これは問題を回避しているだけです。実際の解決策は何ですか、または実際の設計上の問題は何ですか?私たちは皆これをやりたいようですが、それは設計上の欠陥を示していますか?
13 c# 

3
複数のOauth2アクセストークン
oAuth2を使用するAPIと、このAPIをバックエンドとして使用する独自のモバイルアプリがあります。ユーザーは複数のデバイス(iPhone、iPad、Androidタブレット、Androidフォンなど)を介して同時にログオンできるため、各接続を区別するAPIが必要です。個別のアクセストークンを介してこれを実行したいです。各クライアントは個別のアクセストークンを取得します。 問題は、現在使用している実装(spring-security-oauth2)がclient_id、ユーザー名、スコープに基づいて一意のキーを生成することです。したがって、基本的に、アクセストークンを取得すると、すべてのクライアントは同じユーザーに対して同じアクセストークンを取得します。これは、DefaultAuthenticationKeyGeneratorを使用して行われます。 認証キージェネレーターを無視して、クライアントからのリクエストごとに新しいアクセストークンを作成するだけで安全ですか?
13 spring  oauth2 

3
動的スコープを持つ言語でどのように安全にリファクタリングしますか?
動的スコープを持つ言語で動作しない幸運をお持ちの方のために、それがどのように機能するかについて少しおさらいさせてください。次のように動作する「RUBELLA」と呼ばれる擬似言語を想像してください。 function foo() { print(x); // not defined locally => uses whatever value `x` has in the calling context y = "tetanus"; } function bar() { x = "measles"; foo(); print(y); // not defined locally, but set by the call to `foo()` } bar(); // prints "measles" followed by "tetanus" …

4
モックはオープン/クローズの原則に違反しますか?
少し前に、私は見つけることができないStack Overflowの回答で、パブリックAPIをテストする必要があることを説明した文を読み、著者はインターフェイスをテストする必要があると言いました。また、メソッドの実装が変更された場合、テストケースを変更する必要はありません。これを行うと、テスト中のシステムが機能することを確認する契約が破られるため、著者は説明しました。つまり、メソッドが機能しない場合はテストが失敗しますが、実装が変更されたためではありません。 私たちがock笑について話すとき、これは私の注意を呼びました。モックはテスト対象システムの依存関係からの期待呼び出しに大きく依存しているため、モックはインターフェイスではなく実装と密接に結合されています。 モックとスタブの調査中、いくつかの記事は、依存関係からの期待に依存しないため、モックの代わりにスタブを使用する必要があることに同意しています。 私の質問は次のとおりです。 モックはオープン/クローズの原則に違反しますか? 最後の段落のスタブを支持する議論に欠けているものはありますか? もしそうなら、いつスモックを作成するのに適したユースケースになり、スタブを使用するのに適したユースケースになりますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.