On Tuesday, January 12, 2016 at 3:36:13 PM UTC-5, Robert wrote: > Hi, > > I modify a test suite, and simplified to the below content. > I am interested in function: > test_bad_covariance_type() > > I think that it tests for wrong type input, i.e. > 'badcovariance_type' > will generate error, which is expected. Thus, it passes test. > > When a correct type, such as 'diag', is given, there will be no error > generated. pytest will declare a failure. > > > Unfortunately, it will always pass the pytest for both cases. > > What is wrong with my code or my understanding? > > > Thanks, > > > > > ////////////// > from __future__ import absolute_import > > from unittest import TestCase > > import numpy as np > import pytest > > from hmmlearn import hmm > > from . import log_likelihood_increasing, make_covar_matrix, normalized > > > class GaussianHMMTestMixin(object): > covariance_type = None # set by subclasses > > def setUp(self): > self.prng = prng = np.random.RandomState(10) > self.n_components = n_components = 3 > self.n_features = n_features = 3 > self.startprob = prng.rand(n_components) > self.startprob = self.startprob / self.startprob.sum() > self.transmat = prng.rand(n_components, n_components) > self.transmat /= np.tile(self.transmat.sum(axis=1)[:, np.newaxis], > (1, n_components)) > self.means = prng.randint(-20, 20, (n_components, n_features)) > self.covars = dict( > (cv_type, make_covar_matrix(cv_type, n_components, n_features)) > for cv_type in ["spherical", "tied", "diag", "full"]) > self.expanded_covars = { > 'spherical': [np.eye(n_features) * cov > for cov in self.covars['spherical']], > 'diag': [np.diag(cov) for cov in self.covars['diag']], > 'tied': [self.covars['tied']] * n_components, > 'full': self.covars['full'], > } > > def test_bad_covariance_type(self): > with pytest.raises(ValueError): > #h = hmm.GaussianHMM(20, covariance_type='badcovariance_type') > h = hmm.GaussianHMM(covariance_type='diag') > h.means_ = self.means > h.covars_ = [] > h.startprob_ = self.startprob > h.transmat_ = self.transmat > h._check() > > def test_fit(self, params='stmc', n_iter=5, **kwargs): > h = hmm.GaussianHMM(self.n_components, self.covariance_type) > h.startprob_ = self.startprob > h.transmat_ = normalized( > self.transmat + np.diag(self.prng.rand(self.n_components)), 1) > h.means_ = 20 * self.means > h.covars_ = self.covars[self.covariance_type] > > lengths = [10] * 10 > X, _state_sequence = h.sample(sum(lengths), random_state=self.prng) > > # Mess up the parameters and see if we can re-learn them. > # TODO: change the params and uncomment the check > h.fit(X, lengths=lengths) > > > > > class TestGaussianHMMWithSphericalCovars(GaussianHMMTestMixin, TestCase): > covariance_type = 'spherical' > > def test_fit_startprob_and_transmat(self): > self.test_fit('st') > > def test_bad_covariance_type0(self): > self.test_bad_covariance_type()
It turns out that it always raises error, because there are other errors besides the covariance_type object. That is, pytest works as expected. Thanks, -- https://mail.python.org/mailman/listinfo/python-list