如果没有指定测试路径, Pytest显示错误



在我的tests/文件夹中有一个conftest.py,其中包含一个带有spark上下文的fixture,如下所示:

import pytest
from pyspark import SparkConf
from sedona.utils import SedonaKryoRegistrator, KryoSerializer
from sedona.register import SedonaRegistrator 
from pyspark.sql import SparkSession
@pytest.fixture
def spark_session_sedona():
parameters = {'spark.driver.maxResultSize': '3g', 'spark.hadoop.fs.s3a.impl': 'org.apache.hadoop.fs.s3a.S3AFileSystem', 'spark.sql.execution.arrow.pyspark.enabled': True, 'spark.scheduler.mode': 'FAIR'}
spark_conf = SparkConf().setAll(parameters.items())
spark_session_conf = (
SparkSession.builder.appName('appName')
.enableHiveSupport()
.config('spark.jars.packages', 'org.apache.hadoop:hadoop-common:3.3.4,'
'org.apache.hadoop:hadoop-azure:3.3.4,'
'com.microsoft.azure:azure-storage:8.6.6,'
'io.delta:delta-core_2.12:1.0.0,'
'org.apache.sedona:sedona-python-adapter-3.0_2.12:1.2.1-incubating,'
'org.datasyslab:geotools-wrapper:1.3.0-27.2')
.config(conf=spark_conf)
.config("spark.serializer", KryoSerializer.getName)
.config("spark.kryo.registrator", SedonaKryoRegistrator.getName)
)
return spark_session_conf.getOrCreate()
然后,我有一个测试,这个夹具作为参数,基本上执行:
SedonaRegistrator.registerAll(spark)

当我执行命令

pytest

返回错误:

TypeError: 'JavaPackage' object is not callable

但是,如果我执行:

pytest src/测试/testrongedona.py

它通过测试,没有任何问题。

有人知道发生了什么事吗?

完全错误:

src/tests/utils/test_lanes_scale.py:39: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/adas_lanes/utils/lanes_scale.py:112: in lanes_sql_line
SedonaRegistrator.registerAll(spark)
/home/vscode/.local/lib/python3.8/site-packages/sedona/register/geo_registrator.py:43: in registerAll
cls.register(spark)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cls = <class 'sedona.register.geo_registrator.SedonaRegistrator'>
spark = <pyspark.sql.session.SparkSession object at 0x7f847a72f340>
@classmethod
def register(cls, spark: SparkSession):
>       return spark._jvm.SedonaSQLRegistrator.registerAll(spark._jsparkSession)
E       TypeError: 'JavaPackage' object is not callable

PysparkSession行为作为一个单例实例模型,所以如果在你的代码或在另一个测试的某个地方,你有一个初始化与SparkSession.builder.getOrCreate()可能当你试图创建一个新的与Sedona,而不是创建一个它会检索一个创建没有Sedona。

当您运行隔离测试时,创建的SparkSession具有Apache Sedona配置。另一方面,当您运行完整的套件时,spark会话很可能在另一个测试用例或代码步骤中初始化。

要让fixture在测试套件的开头和SparkSession.builder.getOrCreate()的其余部分使用Sedona配置运行,您可以向注释器添加以下内容:

@pytest.fixture(scope="session", autouse=True)
def spark_session_sedona():

最新更新