#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m, k;
char ans[N][N];
int nxt[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
char check(int x1, int y1, int x2, int y2) {
  set<char> se;
  for (int i = 0; i < 4; i++) {
    int tx = x1 + nxt[i][0];
    int ty = y1 + nxt[i][1];
    if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && ans[tx][ty])
      se.insert(ans[tx][ty]);
  }
  for (int i = 0; i < 4; i++) {
    int tx = x2 + nxt[i][0];
    int ty = y2 + nxt[i][1];
    if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && ans[tx][ty])
      se.insert(ans[tx][ty]);
  }
  for (int i = 0; i < 26; i++) {
    char c = 'a' + i;
    if (!se.count(c)) return c;
  }
}
void draw(int x, int y, int cnt) {
  for (int i = y; i <= m && cnt < k; i += 2) {
    for (int j = x; j <= n && cnt < k; j++) {
      ans[j][i] = ans[j][i + 1] = check(j, i, j, i + 1);
      cnt++;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (!ans[i][j]) {
        ans[i][j] = ans[i + 1][j] = check(i, j, i + 1, j);
        cnt++;
      }
    }
  }
  for (int i = 1; i <= n; i++) printf("%s\n", ans[i] + 1);
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    scanf("%d%d%d", &n, &m, &k);
    memset(ans, 0, sizeof ans);
    if (n % 2 == 0 && m % 2 == 0) {
      if (k % 2)
        puts("NO");
      else {
        puts("YES");
        draw(1, 1, 0);
      }
    } else if (n % 2) {
      if (k >= m / 2 && (k - m / 2) % 2 == 0) {
        puts("YES");
        int cnt = 0;
        for (int j = 1; j <= m; j += 2)
          ans[1][j] = ans[1][j + 1] = check(1, j, 1, j + 1), cnt++;
        draw(2, 1, cnt);
      } else
        puts("NO");
    } else {
      if (k > n * (m - 1) / 2 || k % 2)
        puts("NO");
      else {
        puts("YES");
        draw(1, 1, 0);
      }
    }
  }
  return 0;
}
