Test suite kami memiliki banyak DeprecationWarnings dari kode kami sendiri. Tim saya telah mencela hal-hal tanpa memperbaiki (atau memeriksa peringatan) tes yang terpengaruh. Saya pikir cara terbaik untuk menyelesaikan ini adalah dengan mengubah peringatan itu menjadi pengecualian atau gagal tes saat berjalan dalam konteks pengujian. Dengan cara ini, tim tidak akan memperkenalkan DeprecationWarning tanpa menyesuaikan kembali pengujian yang terpengaruh.

Terlebih lagi, jika konversi itu bisa bertahap (kami memiliki banyak tes yang perlu kami mulai perbaiki satu per satu) itu akan bagus. Semacam daftar yang diizinkan yang dapat saya kurangi dari waktu ke waktu.

Berikut adalah skenario saat ini:

import warnings

class Addition:
    def __init__(self, int1, int2):
        self.int1 = int1
        self.int2 = int2

    def get_result(self):
        warnings.warn("The method get_result() is being deprecated. Use result() instead.",
                      DeprecationWarning, 2)
        return self.result()

    def result(self):
        return self.int1 + self.int2
from unittest import TestCase
from addition import Addition

class CustomTestCase(TestCase):
    # ...
    pass

class TestResultOperations(CustomTestCase):
    def test_addition(self):
        addition = Addition(2, 3)
        self.assertEqual(addition.get_result(), 5)

Jika ini membantu, kami menjalankan tes ini dengan tox.

0
luciano 10 Mei 2021, 17:43

2 jawaban

Jawaban Terbaik

Inilah cara saya akhirnya melakukannya:

class CustomTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
      allow_DeprecationWarning_modules = [ 
            "...",  # This is the allowlist, from where I will 
            "...",  # progressively start removing modules that
            "...",  # use deprecated calls
      ]  
      warnings.filterwarnings("error", category=DeprecationWarning)
      for mod in allow_DeprecationWarning_modules:
          warnings.filterwarnings("default", category=DeprecationWarning, module=mod)

Metode setUpClass berjalan satu kali, sebelum memulai dengan pengujian. Di sana, saya menetapkan tindakan "error" ke kategori peringatan DeprecationWarning dan saya menambahkan "pengecualian" untuk berperilaku sebagai "default". Perhatikan bahwa ini adalah test runner agnostic.

0
luciano 11 Mei 2021, 10:32

Tidak ada jawaban lengkap, tetapi beberapa tips:

Saya tidak tahu cara melakukan ini secara bertahap.

Saya biasanya tidak akan mengubah semua peringatan menjadi pengecualian, karena kemudian juga peringatan di lib pihak ke-3 akan menyebabkan kegagalan pengujian.

Padahal, Anda dapat mengawali perintah pengujian di bagian perintah tox dengan tanda hubung. Kemudian juga perintah dengan kode pengembalian bukan nol dapat berjalan dan menampilkan kesalahan, tanpa membuat tox lengkap berjalan gagal.

Saya cukup yakin Anda dapat menggunakan https://docs.python.org /3/using/cmdline.html#envvar-PYTHONWARNINGS untuk mengubah peringatan menjadi kesalahan, tetapi saya harus mencarinya. Saya mobile saat ini.

Perbarui

Seperti yang Anda sebutkan, Anda menggunakan pytest sebagai test runner...

[testenv:businessasusual]
commands = pytest <your-tests>  # works as usual

[testenv:deprecations]
commands = - pytest -W error::DeprecationWarning <your-tests>  # works

... dimana

  • tanda hubung terdepan (dalam spasi!!) membuat tox berjalan secara keseluruhan tidak gagal, tapi tetap menunjukkan kegagalan!!
  • "-W error :: DeprecationWarning" mengubah peringatan menjadi kesalahan

Kemudian Anda selalu dapat menjalankan keduanya, atau hanya salah satunya melalui -e.

Ini akhirnya berarti, kesalahan pengujian sekarang ditampilkan, tetapi tidak merusak proses tox.

0
J.G. 11 Mei 2021, 05:38