diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -2,6 +2,10 @@
 
 ## [Unreleased]
 
+## [0.1.2.3] - 2019-12-29
+### Added
+- quick-check tests for codon-optimization algorithm
+
 ## [0.1.2.2] - 2019-12-25
 ### Fixed
 - wrike-438378826: CHO codon table fixed
diff --git a/cobot-tools.cabal b/cobot-tools.cabal
--- a/cobot-tools.cabal
+++ b/cobot-tools.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 84a7b89a1041e9805b22b527f40e7624a4313d166c84a98dae62d1025b096246
+-- hash: c103fb434308ace7b65d824296158feae6828093d573662118d87fb7438dba25
 
 name:           cobot-tools
-version:        0.1.2.2
+version:        0.1.2.3
 synopsis:       Biological data file formats and IO
 description:    Please see the README on GitHub at <https://github.com/less-wrong/cobot-tools#readme>
 category:       Bio
diff --git a/test/SpecCodonOptimization.hs b/test/SpecCodonOptimization.hs
--- a/test/SpecCodonOptimization.hs
+++ b/test/SpecCodonOptimization.hs
@@ -2,7 +2,7 @@
 
 module SpecCodonOptimization where
 
-import           Bio.NucleicAcid.Nucleotide.Type                (DNA)
+import           Bio.NucleicAcid.Nucleotide.Type                (DNA (..))
 import           Bio.Protein.AminoAcid                          ()
 import           Bio.Protein.AminoAcid.Type                     (AA)
 import           Bio.Tools.Sequence.CodonOptimization.Algo      (optimizeAA,
@@ -11,9 +11,10 @@
                                                                  scoreCmp,
                                                                  scoreSequence)
 import           Bio.Tools.Sequence.CodonOptimization.Constants (ak2Codon)
-import           Bio.Tools.Sequence.CodonOptimization.Types     (CodonScoreConfig(..),
+import           Bio.Tools.Sequence.CodonOptimization.Types     (CodonScoreConfig (..),
                                                                  Organism (..),
                                                                  defaultForbiddenRegexp)
+import           Control.Monad                                  (replicateM)
 import           Data.List                                      (foldl',
                                                                  maximumBy,
                                                                  minimumBy)
@@ -22,8 +23,13 @@
 import           System.Random
 import           Test.Hspec                                     (Expectation,
                                                                  Spec, describe,
-                                                                 it, shouldBe,
+                                                                 it, runIO,
+                                                                 shouldBe,
                                                                  shouldSatisfy)
+import           Test.Hspec.QuickCheck                          (prop)
+import           Test.QuickCheck.Gen                            (Gen, elements)
+import           Test.QuickCheck.Property                       (Property,
+                                                                 forAll)
 
 confHuman :: CodonScoreConfig
 confHuman = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 2.6 100 1 60 defaultForbiddenRegexp
@@ -67,6 +73,9 @@
 codonOptimizationSpec :: Spec
 codonOptimizationSpec =
     describe "Codon optimization spec" $ do
+        optimizedAgainstRandom confCHO
+        optimizedAgainstRandom confHuman
+        optimizedAgainstRandom confEColi
         optimizeSequence
         optimizeSequenceForEColi
         optimizeSequenceForCHO
@@ -312,3 +321,20 @@
         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 80.74362252733329
         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"
          `shouldBe` 96.19662511761598
+
+optimizedAgainstRandom :: CodonScoreConfig -> Spec
+optimizedAgainstRandom conf = describe "optimizedAgainstRandom" $ do
+        let ak = "GQPREPQVYTLPPSRDELTKNQVSLTCLVKGFYPSDIAVEWESNGQPENNYKTTPPVLDSDGSFFLYSKLTVDKSRWQQGNVFSCSVMHEALHNHYTQKSLSLSPGK"
+        gen <- runIO $ genNKSequence ak
+        prop "optimized sequence should have better score than any random sequence" (runBatchCheck ak gen)
+  where
+    runBatchCheck :: [AA] -> Gen [DNA] -> Property
+    runBatchCheck ak gen = forAll gen (\nk -> scoreSequence conf res >= scoreSequence conf nk)
+      where
+        res = optimizeAA conf ak
+
+genNKSequence :: [AA] -> IO (Gen [DNA])
+genNKSequence aa = elements <$> variants aa
+
+variants :: [AA] -> IO [[DNA]]
+variants aa = replicateM 100 (toRandomNKSequ aa)
