2009-10-19 34 views
5

開発中のPythonライブラリがあります。開発中に、私はそのライブラリのいくつかの部分を新しいバージョンのテストに使用したいと思います。つまり、開発コードをテストするために安定したコードを使用します。これをPythonで行う方法はありますか?同じプロセスで異なるバージョンのPythonライブラリを使用する

編集:具体的には、多くの有用なことがあるライブラリ(LibA)があります。また、いくつかのテスト機能(LibT)を提供するためにLibAを使用するテストライブラリが用意されています。私たちはLibTを使ってLibAをテストしたいが、LibAはLibAに依存しているので、LibAをテストしながら安定したバージョンのLibAを使用することにする(LibTをテストした後で新しいLibAを使うように変更するため)。したがって、ユニットテストを実行する場合、LibA-devテストはLibA-stableに依存するLibTコードを使用します。

RPyCを別のプロセスで使用して安定したコードを呼び出す方法がありますが、気密な方法で実装するのは難しいです(正しく終了するようにして、複数のインスタンスを同じコンピュータ上で同じ時間など)。

おかげ

+1

通常のソースコード管理ツールを使用して、安定した開発コードの構成を構築できないのはなぜですか?誰もがブランチを持つSVNでこれを行います。プログラミングもありません。なぜこれを行うためにSVNブランチを使用できないのですか? –

+1

どの分岐がこれに関連しているのかわからないので、私は何をしようとしているのか理解するのを助けることを望んで、少し明確に質問をしました。 – abyx

答えて

0

私は、あなたのテストを設定する必要があり、正確に方法がわからないですが、あなたはお互い一緒に実行している両方のインスタンスを取得するためにVirtualEnvを使用することができます。

+0

それは横並びではなく、実際にはもう一方を使用する必要があります。 – abyx

1

libA(stable)に依存するlibTを使用してlibA-devを "テスト"すると、実稼働環境で動作するようにlibA-devが実際にテストされていません。 libA-devを実際にテストする唯一の方法は、完全に突っ込んでlibTをlibA-devに依存させることです。これがあなたの単体テストを破るなら、それは良いことです - それはあなたに何を修正する必要があるかを示しています。

単体テストをお持ちでない場合は、安定したlibAとlibTを先に使ってください!

「バージョン管理システム」(例:bzr、hg、svn、git)の使用をお勧めします。次に、あなたのプロジェクトの支店を "安定"と "devA"にすることができます。

ブランチDEVAで作業するには、まず確認してくださいPYTHONPATH環境変数が他の枝を除外することにより、

export PYTHONPATH=/path/to/devA 

を実行します、あなたは、Pythonはあなたが望むだけのモジュールを使用している保証しています。

dev - > stableのコードをマージするときは、バージョンコントロールソフトウェアで簡単に行うことができます。

バージョン管理では、大胆な変更を試みることもできます。大きな変更を試みることは恐ろしいものではありません。物事がうまくいかない場合、元に戻すのは簡単です。これとPYTHONPATHの間では、常に既知の作業コードに戻ることができます。

libA-dev-libAをlibA-devをテストするために使用する必要があると思われる場合は、すべてのモジュールの名前を変更して、すべてのimport文は、libA-devとlibAを明確に区別します。たとえば、libAにmoduleA.pyというモジュールがある場合は、moduleA_dev.pyという名前に変更します。

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

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

は、名前の変更を元に戻すあなたは、コード内moduleA_devにmoduleAへのすべての参照を変更する必要があります

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

次を実行します。 > "moduleA_dev" - コマンド

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

は "moduleA" を変える、LIBA-devの中のすべての*の.pyファイルを変更します。

このコマンドには注意してください。これは危険です。なぜなら、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へのすべての参照を変更することができます。

+0

しかし、彼らは別のプロジェクトです、LibATにはどんな意味がありますか? LibTはLibAの安定したバージョンを使いたいと思っています。私は決して他のコードでLibTの開発版を使用したくない、dev-LibAをテストするために安定したLibAを持つ安定したLibTのみ – abyx

+0

あなたの状況をうまく処理するために私の答えを編集しました。 – unutbu

1

は、「我々はLibTを使用してLIBAをテストしたいのですが、LibTはLIBAに依存するためLibTのテスト中に、我々はむしろそれは、LIBAの安定したバージョンを使用するようにしたい」それはTを使用しても意味がありません

+ AはAをテストするのに適しています。

LibAは本当に一緒にマッシュされた2つのものです:A1とA2。

TはA1に依存します。

実際には、TとA1を使用してA2をアップグレードしてテストしています。

LibAをTが必要とする部分とそれ以外の部分に分解すると、この循環依存を破ることができます。

関連する問題