Pydevによる継続的な単体テスト(PythonおよびEclipse)
-
06-07-2019 - |
質問
バックグラウンドの単体テストをPydev Eclipse環境に統合する方法はありますか?
ユニットテストは正常に実行されますが、ソースファイルの変更に基づいてバックグラウンドで実行するように統合し(たとえば鼻を使用)、結果をEclipseに統合します(テストが失敗すると大きな赤いXが考えられます)コンソールとトレースログビューを使用)。
いいえ、noseを側面で実行するコマンドプロンプトはカウントされません。
RoRを開発するときに、このEclipse統合を使用しました。
ありがとう、
Tal。
編集:新しいPydev(1.6.4)をご覧ください http:// pydev .org / manual_adv_pyunit.html
解決
この機能はPyDev 2.0.1に追加され、pythonファイルが変更されるたびに最後のテスト実行でテストを再起動するオプションと、エラーのみを再実行する追加オプションがあります-完全なテストを実行しますエラーが見つからなかった場合は、エラーを処理し、すべてがパスされてスイート全体の最終起動が完了すると考えられます(その後、別のタスクに進むことができます)。
現在のナイトリービルドには、この機能が組み込まれています。
他のヒント
Pydevにはいくつかの単体テスト統合がありますが、それは実行構成としてのみです...そう...
これはあまりエレガントな方法ではありませんが、次の場合:
- プロジェクトの有効化->自動ビルド
- プロジェクトのプロパティで、Programタイプの新しいビルダーを追加します
- テストを実行するように設定し、「自動ビルド中」を選択します
少なくとも、リソースの保存時にテスト結果をコンソールに出力するものが得られます。
PyDevにはかなり強力なスクリプトサポートがあることがわかりました。残念ながら、私はあなたのためにそれをすべてする時間はありません(しかし、これを完了したら、ここに投稿してください:)
空のフォルダーに pyedit_nose.py
という名前のファイルを作成した場合:
assert cmd is not None
assert editor is not None
if cmd == 'onSave':
from java.lang import Runtime
from java.io import BufferedReader
from java.io import InputStreamReader
from org.eclipse.core.resources import ResourcesPlugin
from org.eclipse.core.resources import IMarker
from org.eclipse.core.resources import IResource
proc = Runtime.getRuntime().exec('ls -al')
extra_message = BufferedReader(InputStreamReader(proc.inputStream)).readLine()
r = ResourcesPlugin.getWorkspace().getRoot()
for marker in r.findMarkers(IMarker.PROBLEM, False, IResource.DEPTH_INFINITE):
if marker.getAttribute(IMarker.MESSAGE).startsWith("Some test failed!"):
marker.delete()
for rr in r.getProjects():
marker = rr.createMarker(IMarker.PROBLEM)
marker.setAttribute(IMarker.MESSAGE, "Some test failed! " + extra_message)
marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH)
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR)
Preferences &> PyDev->このディレクトリを指すようにPydevのスクリプトを設定すると、ファイルが保存されるたびにワークスペース内のすべてのプロジェクトにエラーのマークが付けられます。
ls
ではなく、解析しやすい形式でテスト結果を返すスクリプトを実行し、出力を解析することにより、適切な場所にマーカーを配置できるはずです。
いくつかの出発点についてはこちらをご覧ください:
- PydevのJythonスクリプト
- IMarker はマーカーを表します。
- IResource は、マーカーを付けるものです。ワークスペース、プロジェクト、ファイル、ディレクトリなどです。
resource.createMarker(IMarker.PROBLEM)
は問題マーカーを作成します。 - IProject は、プロジェクトを表す
IResource
の一種です。members()
メソッドを使用してコンテンツを取得します。
初めて手動でテストを実行します( Run> Run As> Python unit test )。その後、私は使用します
Ctrl + S
で保存して魔法が発生することを期待する代わりに、 Ctrl + Shift + F9
でファイルを保存してテストを実行します。
Ctrl + Shift + F9
キーの組み合わせは、最後の実行構成を再起動します。
免責事項:私はEclipseとPyDevを初めて使用するので、愚かな/明白/間違った何かを提案している可能性があります
「おせっかい」を強化しました;ドキュメントを自動的に構築し、テストを実行するスクリプト 継続的に。何も素晴らしいものではありませんが、仕事は完了です。元の リンクがダウンしました。元のうるさいスクリプトとは異なり、このスクリプトはディレクトリを再帰的にスキャンします 複数のパターンを検索できます。
import os
import os.path
import sys
import stat
import time
import subprocess
from fnmatch import fnmatch
def match_patterns(pathname, patterns):
"""Returns True if the pathname matches any of the given patterns."""
for pattern in patterns:
if fnmatch(pathname, pattern):
return True
return False
def filter_paths(pathnames, patterns=["*"], ignore_patterns=[]):
"""Filters from a set of paths based on acceptable patterns and
ignorable patterns."""
result = []
if patterns is None:
patterns = []
if ignore_patterns is None:
ignore_patterns = []
for path in pathnames:
if match_patterns(path, patterns) and not match_patterns(path, ignore_patterns):
result.append(path)
return result
def absolute_walker(path, recursive):
if recursive:
walk = os.walk
else:
def walk(path):
return os.walk(path).next()
for root, directories, filenames in walk(path):
yield root
for directory in directories:
yield os.path.abspath(os.path.join(root, directory))
for filename in filenames:
yield os.path.abspath(os.path.join(root, filename))
def glob_recursive(path, patterns=["*"], ignore_patterns=[]):
full_paths = []
for root, directories, filenames in os.walk(path):
for filename in filenames:
full_path = os.path.abspath(os.path.join(root, filename))
full_paths.append(full_path)
filepaths = filter_paths(full_paths, patterns, ignore_patterns)
return filepaths
def check_sum(path='.', patterns=["*"], ignore_patterns=[]):
sum = 0
for f in glob_recursive(path, patterns, ignore_patterns):
stats = os.stat(f)
sum += stats[stat.ST_SIZE] + stats[stat.ST_MTIME]
return sum
if __name__ == "__main__":
if len(sys.argv) > 1:
path = sys.argv[1]
else:
path = '.'
if len(sys.argv) > 2:
command = sys.argv[2]
else:
command = "make -C docs html; bin/python tests/run_tests.py"
previous_checksum = 0
while True:
calculated_checksum = check_sum(path, patterns=['*.py', '*.rst', '*.rst.inc'])
if calculated_checksum != previous_checksum:
previous_checksum = calculated_checksum
subprocess.Popen(command, shell=True)
time.sleep(2)
これがお役に立てば幸いです。
=)
Nosy (pypiで利用可能)を使用します:
ソースファイルが作成されるたびにノーズテスト検出および実行ツールを実行する 変更されます。