J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.

PyQCheck

PyQCheck publié à la fin du mois d'août de l'année dernière. Publié pour Python 2.7 tout le temps, et fait setup.py Je l'ai laissé dans le référentiel, donc Je pensais que c'était un gaspillage, alors j'ai pris les mesures suivantes.

Il n'a que des fonctionnalités médiocres, mais je pense qu'il peut être utilisé raisonnablement bien.

Comment il a été créé

J'ai oublié les détails, mais la bibliothèque appelée QuickCheck s'est enthousiasmée dans une très petite zone à un certain endroit. Similaire à QuickCheck pour les personnes qui ont différentes langues préférées dans leurs langages de programmation préférés Je pense que c'est parce que j'ai créé un framework qui permet de tester.

Que faire

En termes simples, il se comporte comme suit

--Créez votre propre fonction qui prend des arguments. --Entrez et exécutez une valeur qui garantit la plage qui peut être traitée pour cet argument et qui garantit le type.

Utilisons-le pour le moment

Environnement d'exploitation

L'environnement d'exploitation présente les conditions suivantes

--Python 3.3 ou supérieur doit être installé

Installation

Vous pouvez l'installer avec la commande suivante. ... Utilisez pyvenv pour préparer l'environnement d'installation afin d'éviter la pollution de l'environnement du système. Par exemple, supprimez distribuer et mettez easy_install pour préparer l'installation.

> mkdir ~/Sandbox/PyQCheck
> cd ~/Sandbox/PyQCheck
> pyvenv .venv
> source .venv/bin/activate
> curl -O http://python-distribute.org/distribute_setup.py
> python distribute_setup.py
> easy_install PyQCheck

C'est la fin de la préparation.

Voyons voir comment ça fonctionne

L'extrait de code de l'exemple d'opération est joint ci-dessous.

equal_length.py


# -*- coding:utf-8 -*-

from pyqcheck import PyQCheck, Arbitrary

def equal_length(a, b):
  return len(a) == len(b)

PyQCheck(verbose=True).add(
  Arbitrary(
    ('string', dict(min=10, max=10)), 
    ('string', dict(min=10, max=10))
  ).property(
    'len(a) == len(b)', equal_length
  )
).run(10).result()

Courir

Lorsque vous l'exécutez, il sera affiché sous la forme suivante.

pyqcheck-1.png

Qu'est-ce que tu fais

  1. Pour une fonction où Arbitrary prend deux arguments, la longueur minimale est de 10, le maximum est de 10, soit 10 caractères. Passer une chaîne
  2. equal_length est passé à a et b
  3. Renvoie True car il s'agit d'une chaîne de même longueur
  4. Après 10 tests, tout va bien, il est donc rempli de l'icône ☀.

Après tout

Pour la fonction à tester, comme traitement de l'argument automatique reçu par la fonction Générez de manière appropriée une valeur qui spécifie le type et la longueur de données pris en charge, etc. Passe-t-il correctement le test? Peut être vérifié. Essayez 100 fois, 1000 fois, 10000 fois, et si vous y allez, c'est probablement OK, Se sentir comme ça. (Bien que cela puisse être différent de l'idée originale de QuickCheck ...)

Changer le style d'écriture

Vous pouvez également écrire à l'aide d'un décorateur.

equal_length.py


# -*- coding:utf-8 -*-

from pyqcheck import PyQCheck, set_arbitrary

@set_arbitrary(
  ('string', dict(min=10, max=10)), 
  ('string', dict(min=10, max=10))
)
def equal_length(a, b):
  '''
  len(a) == len(b)
  '''
  return len(a) == len(b)

PyQCheck(verbose=True).run(10).result()

Je pense que cette façon d'écrire est plus propre ...

Usage inhabituel

Vous pouvez également utiliser ce qui suit comme une utilisation inhabituelle de PyQCheck. Exécutons le script suivant. Pour l'exécution, Python3 doit être construit avec le lien avec sqlite3 activé.

insert_random_value_to_the_sqlite.py


# -*- coding:utf-8 -*-

import sqlite3
from pyqcheck import PyQCheck, set_arbitrary

DB_NAME = 'test.db'

@set_arbitrary(
  ('integer', dict(min=0, max=100)),
  ('string', dict(min=3, max=10))
)
def insert_to_sqlite3(age, name):
  con = sqlite3.connect(DB_NAME)
  cur = con.cursor()
  cur.execute('''
    SELECT `name` FROM `sqlite_master` 
      WHERE `type`='table' AND name='users';
  ''')

  if cur.fetchone() is None:
    cur.execute('''
      CREATE TABLE `users` (
        `id` INTEGER NOT NULL PRIMARY KEY,
        `age` INTEGER NOT NULL,
        `name` STRING NOT NULL
      );
    ''')
    con.commit()

  cur.execute('''
    INSERT INTO `users` (`age`, `name`) 
      VALUES (?, ?)
  ''', (age, name))
  con.commit()
  
  return True

PyQCheck(verbose=True).run(30).result()

Courir

Essayez de l'exécuter.

pyqcheck-2.png

Puisque test.rb est créé dans le répertoire courant, jetons un œil au contenu ...

pyqcheck-3.png

En utilisant la propriété de générer une valeur textuelle de PyQCheck et de la passer à une fonction, On dit qu'il a été utilisé pour générer des données factices. États américains, noms de pays du monde, Essayez de créer des données de prénom et de nom couramment utilisées comme arbitraires Si vous faites cela, je pense que cela peut être utilisé pour générer des données factices.

à partir de maintenant

J'ai enregistré le package auprès de PyPI, je souhaite donc continuer la maintenance.

Recommended Posts

J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
À propos de psd-tools, une bibliothèque capable de traiter des fichiers psd en Python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
Un mémo que j'ai écrit un tri rapide en Python
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Je veux travailler avec un robot en python.
Un mémo que j'ai touché au magasin de données avec python
Publier / télécharger une bibliothèque créée en Python vers PyPI
J'ai fait un jeu de frappe simple avec tkinter de Python
Publication d'une bibliothèque qui masque les données de caractères dans les images Python
Créons un script qui s'enregistre avec Ideone.com en Python.
J'ai essayé "un programme qui supprime les déclarations en double en Python"
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
Une histoire qui a disparu quand j'ai spécifié un chemin commençant par tilda (~) en python open
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
[Python] Créez un graphique qui peut être déplacé avec Plotly
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
[Python] J'ai créé ma propre bibliothèque qui peut être importée dynamiquement
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Utilisez networkx, une bibliothèque qui gère les graphiques en python (Partie 2: Tutoriel)
Création d'une bibliothèque pour python capable de gérer facilement la division morphologique
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
J'ai acheté et analysé la loterie jumbo de fin d'année avec Python qui peut être exécutée dans Colaboratory
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
J'ai écrit un tri-arbre qui peut être utilisé pour l'implémentation de dictionnaire à grande vitesse en langage D et Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
[Python] Un programme qui crée des escaliers avec #
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
J'ai créé un modèle de projet Python générique
Présentation d'une bibliothèque qui n'était pas incluse dans pip sur Python / Windows
J'ai fait un programme de gestion de la paie en Python!
J'ai créé une application Web en Python qui convertit Markdown en HTML
J'ai fait un compteur de caractères avec Python
J'ai dessiné une carte thermique avec Seaborn [Python]
J'ai créé un bot Discord en Python qui se traduit quand il réagit
Essayez d'utiliser APSW, une bibliothèque Python que SQLite peut prendre au sérieux
J'ai essayé de développer un formateur qui génère des journaux Python en JSON
J'ai essayé un langage fonctionnel avec Python
[Édition DSU] Lecture de la bibliothèque AtCoder avec un codeur vert ~ Implémentation en Python ~
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
Ce que j'ai fait avec les tableaux Python
Essayez le scraping HTML avec la bibliothèque Python
J'ai fait une carte hexadécimale avec Python
Un monde typé qui commence par Python
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
[IOS] J'ai créé un widget qui affiche la tendance de Qiita dans Pythonista3. [Python]
Lecture de code de faker, une bibliothèque qui génère des données de test en Python
J'ai créé un outil de mot de passe en Python.
J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).