2

テストフレームワークの制御下にある定義で特定の定義を置き換えることは可能ですか、可能であればどのようにしますか?

たとえば、組み込みシステムが define を使用して次のようにポートにアクセスするとします。

#define PORTA_CONFIG (*(volatile unsigned int*) (0x1000))

ここで、「ポート モジュール」が前述の PORTA_CONFIG に正しく読み書きできることを確認したいと思います。PORTA_CONFIG次のようなものに置き換えるにはどうすればよいですか。

volatile unsigned int PORTA_CONFIG;
4

3 に答える 3

0

AudioDroid の回答と同様に、1 つの「ファサード ヘッダー」に含まれるさまざまなヘッダーを使用できます。

インクルードアプローチ (テストダブル)

portconfig.hデータを含めるためのヘッダー - 必要なターゲットに応じて (またはテストに使用している場合)

#ifndef PORTCONFIG_H
#define PORTCONFIG_H

#ifdef TARGET_A
# include <portconfig_target_a.h> /* Use the config for target A */
#elif defined TARGET_B
# include <portconfig_target_b.h> /* Use the config for target B */
#elif defined TEST
# include <portconfig_testing.h> /* Use this instead for testing */
#else
# error "Not supported!" /* Just in case ... */
#endif

#endif /* PORTCONFIG_H */

これらの各ヘッダー ファイルには、ターゲットで必要とされるこれらの「定義」が含まれています。

portconfig_target_a.h

...
#define PORTA_CONFIG (*(volatile unsigned int*) (0x1000))
...

また

portconfig_testing.h

...
volatile unsigned int PORTA_CONFIG;
...

これは、中央#ifdefの 1 か所でのみ必要なため、メンテナンスの労力が少なくて済みます。また、ターゲット/テスト コードの使用法に違いはなく、すべての場合に使用されます。#include <portconfig.h>

抽象化アプローチ

PORTA_CONFIG直接使用する代わりに、関数/マクロに抽象化することもできます。テストのために、これらをモックできます。

typedef IOAddress ...
IOData IOData ...

void writePort(IOAddress addr, IOData data);
IOData readPort(IOAddress);

これには抽象化の利点があり、テストに非常に役立ちます。

このリポジトリには実装といくつかの優れた例があり、特にcode(MockIO、ヘッダー実装サンプル テスト) - CppUTest を使用しています

こちらもご覧ください

于 2015-05-16T19:17:32.843 に答える
0

私があなたの意図を正しく理解していれば、次のようなことができます。

#define TESTING

int main(){
#ifdef TESTING
    volatile unsigned int PORTA_CONFIG;
#else
    #define PORTA_CONFIG (*(volatile unsigned int*) (0x1000))
#endif
于 2015-05-08T00:28:40.947 に答える