5

開発中の Python ライブラリがあります。開発中、そのライブラリの一部を使用して、新しいバージョンをテストしたいと考えています。つまり、開発コードをテストするために安定したコードを使用します。Pythonでこれを行う方法はありますか?

編集:より具体的に言うと、多くの便利なものを備えたライブラリ (LibA) があります。また、いくつかのテスト機能 (LibT) を提供するために、LibA を使用するテスト ライブラリもあります。LibT を使用して LibA をテストしたいのですが、LibT は LibA に依存しているため、LibT をテストしている間は、むしろ安定したバージョンの LibA を使用したいと考えています (テストがパスした場合にのみ、新しい LibA で動作するように LibT を変更するためなど)。そのため、単体テストを実行する場合、LibA-dev テストは LibA-stable に依存する LibT コードを使用します。

私たちが思いついたアイデアの 1 つは、別のプロセスで RPyC を使用して安定したコードを呼び出すことですが、気密な方法で実装するのは難しいです (適切に停止することなどを確認し、複数のインスタンスを同時に実行できるようにするなど)。同じコンピュータなど)。

ありがとう

4

3 に答える 3

1

libA(安定版)に依存するlibTを使用してlibA-devを「テスト」する場合、実稼働環境で動作するため、実際にはlibA-devをテストしていません。libA-devを実際にテストする唯一の方法は、思い切ってlibTをlibA-devに依存させることです。これがユニットテストに失敗した場合、それは良いことです-それはあなたに何を修正する必要があるかを示しています。

ユニットテストがない場合は、今がそれらの作成を開始するときです(最初に安定したlibAとlibTを使用してください!)。

「バージョン管理システム」(bzr、hg、svn、gitなど)を使用することをお勧めします。次に、プロジェクトのブランチを「stable」と「devA」にすることができます。

ブランチdevAで作業するには、最初に実行します

export PYTHONPATH=/path/to/devA

PYTHONPATH環境変数が他のブランチを除外していることを確認することで、Pythonが必要なモジュールだけを使用していることが保証されます。

dev-> stableからコードをマージするときが来ると、バージョン管理ソフトウェアはそれを行う簡単な方法も提供します。

バージョン管理により、より大胆にすることもできます。大きな変更を試みることはそれほど怖いことではありません。うまくいかない場合は、元に戻すのはとても簡単です。それとPYTHONPATHトリックの間で、いつでも既知の機能するコードに戻ることができます。

上記が単にうまくいかないと感じ、libT-which-depends-on-libAを使用してlibA-devをテストする必要がある場合は、すべてのモジュールの名前を変更し、すべてのインポートステートメントを変更する必要がありますlibA-devとlibAを明確に分離します。たとえば、libAにmoduleA.pyというモジュールがある場合は、その名前をmoduleA_dev.pyに変更します。

コマンド

rename -n 's/^(.*)\.py/$1_dev.py/' *.py

すべての*.pyファイルに「_dev」を追加します。(「-n」フラグを使用すると、名前変更コマンドは意図された名前変更のみを表示します。実際に実行するには、「-n」を削除してください。)

名前の変更を元に戻すには、

rename -n 's/^(.*)_dev\.py/$1.py/' *.py

次に、コード内でmoduleAへのすべての参照をmoduleA_devに変更する必要があります。コマンド

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA/moduleA_dev/g' {} \;

LibA-dev内のすべての*.pyファイルを変更し、「moduleA」->「moduleA_dev」を変更します。

このコマンドには注意してください。moduleABという変数がある場合、それはmoduleA_devBに名前が変更されますが、本当に必要なのはmoduleAB_devである可能性があるため、危険です。

この変更を元に戻すには(上記の注意が必要です)、

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA_dev/moduleA/g' {} \;

名前空間を分離すると、循環依存関係が解消されます。libA-devに問題がなければ、moduleA_dev.py-> moduleA.pyを変更し、コード内のmoduleA_dev->moduleAへのすべての参照を変更できます。

于 2009-10-19T11:27:37.187 に答える
1

「LibT を使用して LibA をテストしたいのですが、LibT は LibA に依存しているため、LibT をテストしている間は、むしろ安定したバージョンの LibA を使用したいと考えています」

T + A を使用して A をテストするのは意味がありません。意味があるのは次のとおりです。

LibA は、A1 と A2 という 2 つの要素を組み合わせたものです。

T は A1 に依存します。

実際に起こっていることは、T と A1 を使用して A2 をアップグレードおよびテストしていることです。

LibA を T が必要とする部分とその他の部分に分解すると、この循環依存を断ち切ることができる場合があります。

于 2009-10-19T11:36:01.933 に答える
0

テストをどのように設定する必要があるのか​​正確にはわかりませんが、VirtualEnvを使用して両方のインスタンスを互いに並行して実行できる場合があります。

于 2009-10-19T09:46:58.597 に答える